Kav*_*veh 3 c++ python programming-languages shared-ptr
AFAIK,使用shared_ptr通常是不鼓励的,因为不小心使用它们会导致潜在的错误(除非您对重大利益和仔细检查设计有非常好的解释).
另一方面,Python对象似乎基本上是shared_ptrs(ref_count和垃圾收集).
我想知道是什么让它们在Python中很好地工作但在C++中有潜在危险.换句话说,Python和C++在处理shared_ptr时有什么区别,这使得在C++中不鼓励使用它们但不会在Python中引起类似的问题?
我知道,例如Python会自动检测对象之间的循环,以防止在C++中悬挂循环shared_ptrs导致的内存泄漏.
"我知道,例如Python会自动检测周期" - 这就是让它们很好地工作的原因,至少就"潜在的错误"与内存泄漏有关.
除此之外,C++程序通常在严格的性能限制下编写,而不是Python程序(IMO是不同真实要求的组合,在经验法则上有一些相当虚假的差异,但这是另一个故事).我使用的相当大比例的Python对象并不严格需要引用计数,它们只有一个所有者和一个unique_ptr没问题(或者类似于类类型的数据成员).在C++中,(由人们撰写您正在阅读的建议)可以考虑采用性能优势和明确简化的设计.在Python中,它通常不被认为是一个问题,你付出了性能,你可以保持灵活性,以便稍后决定它是否共享,而不需要任何代码更改(除了采取比原始版本更长的其他引用,我的意思).
顺便说一句,在任何语言中,共享的可变对象都有与它们相关的"潜在错误",如果你在没有看到它们时忘记了哪些对象会改变或不改变.我不仅仅意味着竞争条件:即使在单线程程序中,您也需要注意C++ Predicates不应该改变任何东西,并且您(通常)在迭代它时不能改变容器.不过,我不认为这是C++和Python之间的区别.相反,在某种程度上,你也应该对Python中的共享对象略微保持警惕,并且当你扩展对象的引用时,至少要理解为什么要这样做.
那么,关于您链接到的问题中的问题列表:
shared_ptr为同一个对象创建多个不相关的s - 在Python中不可能进行模拟,因为引用计数器不对用户开放.get()函数获取原始指针并在指向对象超出范围后使用它 - 好吧,如果你正在编写Python/C,你可以搞砸它,但不能用纯Python编写.shared_ptr在需要时创建一个.不能用Python做到这一点.<functional>都不能很好地使用shared_ptr - Python refcounting是内置于运行时(或者我认为应该说是精确的:垃圾收集是如此内置于语言设计中)那里没有图书馆无法应对它.numpy来减少开销.有时Python程序内存耗尽,你需要对它做一些事情,这就是生活;-)shared_ptr< T >这一类定义中也是危险的.enabled_shared_from_this改为使用 - 它可能并不明显,但这是"不要创建与shared_ptr同一对象无关的多个".shared_ptr在多线程代码中使用时需要小心 - 也可以在Python中创建竞争条件,这是"共享可变对象很棘手"的一部分.其中大部分都是因为在C++中你必须明确地做一些事情才能得到引用计数,而如果你不要求它就不能得到它.这提供了几个Python无法提供给程序员的错误机会,因为它只是为您完成.如果你使用shared_ptr正确的是,除了不与它合作的库的存在之外,C++中也没有出现这些问题.那些因为这些原因而谨慎使用它的人基本上都说他们害怕他们会错误地使用它,或者无论如何更害怕他们会误用某些替代品.在你想出一个你认为自己有能力执行的设计之前,很多C++编程都会互相交换不同的潜在错误.此外,作为一种设计理念,它"不为你不需要的东西买单".在这两个因素之间,如果没有一个非常好的解释,一个显着的好处和一个经过仔细检查的设计,你就不会做任何事情.shared_ptr没有什么不同;-)