据我所知,由于粗心使用shared_ptr可能导致潜在的bug(除非您有一个真正好的解释来证明它能带来显著的好处并且经过仔细检查的设计),因此通常不鼓励使用shared_ptr。
另一方面,Python对象似乎本质上就是shared_ptrs(具有引用计数和垃圾回收)。
我想知道的是,是什么使它们在Python中运行良好,但在C++中潜在地危险。换句话说,Python和C++在处理shared_ptr时有何不同,使得在C++中不鼓励使用它们,但在Python中不会引起类似的问题?
例如,我知道Python会自动检测对象之间的循环引用,防止内存泄漏,而这种循环引用可能会导致C++中悬空的循环共享指针的问题。
另一方面,Python对象似乎本质上就是shared_ptrs(具有引用计数和垃圾回收)。
我想知道的是,是什么使它们在Python中运行良好,但在C++中潜在地危险。换句话说,Python和C++在处理shared_ptr时有何不同,使得在C++中不鼓励使用它们,但在Python中不会引起类似的问题?
例如,我知道Python会自动检测对象之间的循环引用,防止内存泄漏,而这种循环引用可能会导致C++中悬空的循环共享指针的问题。
unique_ptr
,并只有在对象实际上是共享的情况下才让用户“升级”为shared_ptr
。但这是为了支持更多用例的细节。我同意,通过经验,您可以编写防御性代码来抵御您已知的错误。如果该类型具有公共构造函数,并且某些人滥用new
而不是使用make_shared
或make_unique
或其他“安全”的构造习惯,则可以认为这是他们的错,应该由审核者验证。 - Steve Jessop