我是一名Objective-C程序员,最近刚开始使用C++,我在我的代码组织中遇到了这个问题:
std::list<char *> stuff = std::list<char *>();
thing *object = new thing(stuff);如果stuff是我的类的生命周期(即,直到它被析构)所需要的对象,如何避免丢失它?
在Objective-C上,我可以简单地在构造函数上调用-retain。在C++上?
发布于 2012-12-25 08:46:37
不要在你不需要的时候使用指针和don't use owning raw pointers (除非你有一个非常好的理由)。
使用自动存储持续时间
std::list<char> stuff;
thing object{stuff};thing的构造函数将以std::list<char>作为其参数:
#include <utility> // for std::move
class thing {
public:
explicit thing(std::list<char> stuff_) : stuff(std::move(stuff_)) {}
private:
std::list<char> stuff;
};如果这样做,当thing超出作用域时,将调用thing的析构函数,隐式调用stuff的析构函数。许多good C++ books非常详细地解释了这一点。
与Objective-C不同,C++使用RAII而不是引用计数。基本规则是:尽可能使用自动存储持续时间,避免原始拥有指针,除非有充分的理由,否则不要使用new。
发布于 2012-12-25 08:47:26
通常的方法是在thing的构造函数中将stuff复制或移动到thing中
class thing {
public:
thing(std::list<char*> stuff) : stuff(std::move(stuff)) {}
private:
std::list<char *> stuff;
};发布于 2012-12-25 09:10:57
不清楚您将如何在示例中使用stuff,因此我将为您提供几个不同的选项。
thing存储自己的stuff副本。在这种情况下,您的类存储std::list<char*>类型的对象。
class thing { public: thing(std::list& aList):m_list(alist){} std::list m_list;};
在构造thing时,会生成stuff的副本并将其存储在类中。当对象被析构时,它将自动释放m_list。
thing存储了对stuff的弱引用。您的类将存储指针(std::list<char*>* m_list)或引用(std::list<char*>& m_list)。thing将能够以任何方式使用您的列表,但它不应该负责资源管理。如果列表的作用域比thing小,那么就会留下一个挂起的引用。
thing getThing() { std::list list1;thing object1(list1);return object1;//错误列表将被释放,object1将具有挂起引用并存储指向stuff的共享指针。这是最像Objective C中的retain的方法。C++没有自动引用计数。如果您希望存储具有共享所有权的对象引用,则可以使用std::shared_ptr。thing存储std::shared_ptr<std::list<char*>> m_list。
std::shared_ptr> stuff = std::make_shared>();thing object( stuff );//引用计数递增,即使stuff被销毁,object仍将持有有效的引用
https://stackoverflow.com/questions/14026761
复制相似问题