是从该对象的方法中删除对象还是从另一个被认为是不良做法的类构造函数中删除?

时间:2016-10-17 14:26:00

标签: c++ c++11 class-design

我有一个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()
}

3 个答案:

答案 0 :(得分:3)

一般来说,你应该分配对象"关闭"到你解除分配的地方。

所以当你只在你的例子中使用它时,你应该保持"删除"关闭并且可以看到" new"。可能有一些原因导致您无法执行此操作,并且在获得所有权时必须对此进行明确评论。

与在构造函数中分配对象时相同,在同一个类中删除它们等。

<强> Howerver:

因为您标记了此c++11。有智能指针显示您的意图并帮助您这样做。

如果您只想让一个实例拥有&#34;所有权&#34;您可以使用std::unique_ptr<A>并将其移至B类。然后,当B被破坏时,它会自动删除A的实例。

如果您拥有共享所有权,则可以使用std::shared_ptr<A>

当没有人再引用指针时,这将删除A的实例。

如果您可以选择unique_ptrshared_ptr

答案 1 :(得分:1)

对象完全可以自行删除,请参阅Is delete this allowed?

更大的问题是这是否是一个好主意。在这种情况下,您的主要代码是使用A创建新的new对象。您可能希望看到匹配的delete与它一起使用,并将其隐藏在对象本身内是一种代码味道。

答案 2 :(得分:0)

B是否需要处理以前由A?

分配的内存

第一种方法

第一个例子似乎是我认为最好的例子,你可以依靠A的析构函数来释放内部内存

第二种方法

使用智能指针形成STL,提升或实现自己的

第三种方法

使用RAII。对象的析构函数将在框架的末尾调用(在相同的嵌套级别关闭括号)。