C++对象保留?
C++ Object Retaining?
我是一名Objective-C程序员,最近开始C++,我在代码的组织上偶然发现了这个问题:
std::list<char *> stuff = std::list<char *>();
thing *object = new thing(stuff);
stuff
是我在类的生命周期内需要的对象(也就是说,直到它被破坏),如何避免丢失它?
在 Objective-C 上,我可以简单地在构造函数上调用-retain
。C++?
当你不需要指针时,不要使用它们,也不要使用拥有原始指针(除非你有很好的理由)。
使用自动存储持续时间:
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
的析构函数。许多好的C++书都非常详细地解释了这一点。
与Objective-C不同,C++使用RAII而不是引用计数。基本规则是:尽可能使用自动存储持续时间,避免原始拥有指针,并且除非您有充分的理由,否则不要使用new
。
通常的方法是在thing
的构造函数中复制或移动到thing
中stuff
:
class thing {
public:
thing(std::list<char*> stuff) : stuff(std::move(stuff)) {}
private:
std::list<char *> stuff;
};
目前尚不清楚您将如何在示例中使用stuff
,因此我将为您提供几个不同的选项。
-
thing
存储自己的stuff
副本。
在本例中,您的类存储类型为std::list<char*>
的对象。class thing { public: thing(std::list<char*>& aList):m_list(alist){} std::list<char*> m_list; };
构造时
thing
将创建stuff
的副本并将其存储在类中。当对象被销毁时,它将自动释放m_list
。 -
thing
存储对stuff
的弱引用。
你的类将存储指针(std::list<char*>* m_list
)或引用(std::list<char*>& m_list
)。thing
将能够以任何方式使用您的列表,但它不应该负责资源管理。如果列表的范围比thing
小,那么您将留下一个挂起的引用。thing getThing() { std::list<char*> list1; thing object1(list1); return object1; //bad - list will be deallocated, object1 will have a hanging reference }
-
thing
存储指向stuff
的共享指针。 这是最类似于目标 C 中retain
的方法,C++没有自动引用计数。如果要存储具有共享所有权的对象引用,可以使用std::shared_ptr
。thing
商店std::shared_ptr<std::list<char*>> m_list
.std::shared_ptr<std::list<char*>> stuff = std::make_shared<std::list<char*>>(); thing object(stuff); //reference count incremented, even if stuff is destroyed object will still hold a valid reference
- 保留计时器集合(对象与指针)的最佳方法
- 更改保留指向其字段的原始指针的对象地址
- 保留对象成员变量的本地副本
- 如何为同一类对象的成员函数保留单独的变量副本?
- 有没有办法在对象上保留弱引用并控制其生存期
- 在C 中进行可选参考,保留对象寿命
- C++对象保留?
- 是否应将移出对象保留为"safe"状态?
- 返回类型,或如何保留对象指针的类型
- 如何获得一个窗口,以便在调整C++大小时保留绘制的对象
- 实例变量列表中的对象未被保留?指针问题
- 保留一个reference_wrapper对象的向量,这是可能的
- 每次创建一个新对象或保留一个对象
- 如何在堆栈上为非默认构造对象保留空间
- 将临时对象保留在寄存器上以避免虚拟机中的额外存储/加载
- std::vector 不保留在实现中实例化的推回对象
- 如何保留指向插入到集合中然后推送到向量中的对象的指针
- 如何在不复制和保留 std::string 对象的情况下获得 C++ std::string 字符数据的所有权
- C++对象中保留 lambda 表达式
- 保留对象和对在函数中创建的对象的引用