我有一个A类,其对象存储一个指针。
这个类的对象将被用在另一个类(B)的构造函数中,它将获取该指针的所有权(从而使A对象无用)或被告知它们的指针是无用的它们不再需要它们(这意味着它们将释放它们所持有的指针所指向的内存)。
因此这些对象有一个指针和一个删除该指针的free
方法。
我的问题是,由于在B&#39?s构造函数使用它们或者使用它们的方法free
之后不再需要这些对象,它被认为是不好的设计/练习告诉B的构造函数还删除它使用的A对象,并在delete this
的末尾插入A::free()
指令?或者我应该坚持手动删除那些?
一个小例子:
A* myobj = new A(new Value(12));
B* myfinalobj;
if (is_useful(myobj)) {
myfinalobj = new B(myobj);
delete myobj;
}
else {
myobj->free();
delete myobj;
}
VS
A* myobj = new A(new Value(12));
B* myfinalobj;
if (is_useful(myobj)) {
myfinalobj = new B(myobj); //myobj deletion is done by B::B(A*)
}
else {
myobj->free(); //myobj deletion is done internally by A::free()
}
答案 0 :(得分:3)
一般来说,你应该分配对象"关闭"到你解除分配的地方。
所以当你只在你的例子中使用它时,你应该保持"删除"关闭并且可以看到" new"。可能有一些原因导致您无法执行此操作,并且在获得所有权时必须对此进行明确评论。
与在构造函数中分配对象时相同,在同一个类中删除它们等。
<强> Howerver:强>
因为您标记了此c++11
。有智能指针显示您的意图并帮助您这样做。
如果您只想让一个实例拥有&#34;所有权&#34;您可以使用std::unique_ptr<A>
并将其移至B类。然后,当B被破坏时,它会自动删除A
的实例。
如果您拥有共享所有权,则可以使用std::shared_ptr<A>
。
当没有人再引用指针时,这将删除A
的实例。
如果您可以选择unique_ptr
到shared_ptr
。
答案 1 :(得分:1)
对象完全可以自行删除,请参阅Is delete this allowed?
更大的问题是这是否是一个好主意。在这种情况下,您的主要代码是使用A
创建新的new
对象。您可能希望看到匹配的delete
与它一起使用,并将其隐藏在对象本身内是一种代码味道。
答案 2 :(得分:0)
B是否需要处理以前由A?
分配的内存第一种方法
第一个例子似乎是我认为最好的例子,你可以依靠A的析构函数来释放内部内存
第二种方法
使用智能指针形成STL,提升或实现自己的
第三种方法
使用RAII。对象的析构函数将在框架的末尾调用(在相同的嵌套级别关闭括号)。