使用c ++ 11中包含的shared_ptr,可以实现半垃圾收集环境。 (通货膨胀?)使用是否会带来一些缺点?
我可以设想一个类模型,在这里你可以创建一个类,在这个类中你最后用shared_ptr键入你的类来缩写语法。
/////////////////
//// MyClass ////
/////////////////
#include <memory>
class MyClass {
public:
Myclass();
};
typedef std::shared_ptr<MyClass> SharedMyClass;
///////////////////////
//// Example Class ////
///////////////////////
class Example {
public:
Example(): myClassObject(new MyClass()) {}
private:
SharedMyClass myClassObject;
};
答案 0 :(得分:10)
当然有一些缺点:您需要额外的内存来维护引用计数,并且每次复制或销毁shared_ptr
实例时,此引用计数都必须递增和递减。如果你的程序使用多个线程,那么引用计数的操作必须以线程安全的方式完成,这可能会增加一些额外的开销,其大小取决于实现。
此开销是否会以总体上的负面影响您的程序取决于您的程序的详细信息。通常,您应该仅将std::shared_ptr
用于真正需要共享的资源,因为它可能在某种程度上是任意的,哪个对象最后需要它们。在其他情况下,单个所有权通常更容易维护,因为您确切知道每个资源的存活时间。
此外,您需要注意std::shared_ptr
不是对象生命周期管理的灵丹妙药。特别是,如果您有两个对象,每个对象都拥有std::shared_ptr
,则对象具有循环所有权,除非您首先通过在其中一个上调用reset()
来中断循环,否则永远不会自动删除。
答案 1 :(得分:3)
值得一提的另一件事是,在使用std::shared_ptr
设计API时需要非常小心。
相对于原始指针的明显优势是自动内存管理(具有循环所有权问题),但其他问题/问题仍然存在。当共享资源时,您放弃(在某种程度上)控制和推理代码的能力。
我可以修改对象,因为我可能不是唯一一个持有它的对象吗?
您更改对象,更改将反映到整个系统。系统越大,影响就越不明显,而且更难以证明它实际上是安全的。 Sean Parent经常说共享ptr实际上和全局变量一样好。
答案 2 :(得分:1)
我的表现很重要我不会使用std :: sahred_ptr。例如,使用实际指针对数组进行排序比使用共享指针排序快5倍。
另一方面,在循环引用的情况下,共享指针不能避免垃圾泄漏的所有麻烦。当然,这可以通过weak_ptr解决,但我的意思是,共享指针也需要得到妥善处理。
我更喜欢将shared_ptr用于静态元素,因为静态元素不会被类的析构函数删除。