从对象的方法或其他类构造函数中删除对象是否被视为不良做法?

Is deleting an object from that object's method or from another class constructor considered bad practice?

本文关键字:对象 不良 是否 方法 其他 构造函数 删除      更新时间:2023-10-16

我有一个类a,它的对象存储一个指针。

这个类的对象要么在另一个类(B)的构造函数中使用,该构造函数将获得该指针的所有权(从而使A对象无用),要么被告知它们的指针无用并且不再需要它们(这意味着它们将释放它们持有的指针所指向的内存)。

所以这些对象有一个指针和一个删除指针的free方法。

我的问题是,因为对象将不再需要后,他们要么被B的构造函数使用或他们的方法free被使用,它被认为是坏的设计/实践告诉B的构造函数也删除它使用的A对象,并在A::free()的末尾插入delete this指令?还是我应该坚持手动删除它们?

一个小例子:

A* myobj = new A(new Value(12));
B* myfinalobj;
if (is_useful(myobj)) {
    myfinalobj = new B(myobj);
    delete myobj;
}
else {
    myobj->free();
    delete myobj;
}

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()
}

一般情况下,您应该将对象"close"分配到您释放它们的位置。

所以当你只在你的例子中使用它时,你应该保持"delete"接近并对"new"可见。可能有一些原因导致你不能这样做,当你获得所有权时,你必须清楚地评论这一点。

与在构造函数中分配对象、在同一类中删除对象等相同。

不管:

既然你标记了这个c++11。有一些聪明的指针可以显示你的意图并帮助你做到这一点。

如果你只想要一个实例具有"所有权",你可以使用std::unique_ptr<A>并将其移动到类B中,然后在B被销毁时自动删除A的实例。

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

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

如果你更喜欢unique_ptr而不是shared_ptr

对象删除自己是完全可以的,参见是否允许删除?

更大的问题是这是否是个好主意。在本例中,您的主代码是用new创建一个新的A对象。您希望看到与之匹配的delete,并将其隐藏在对象本身中是一种代码气味。

B是否需要使用先前由A分配的内存?

第一个方法

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

第二种方法

使用STL, boost中的智能指针,或者实现你自己的

第三种方法

RAII使用。对象的析构函数将在框架的末尾被调用(右括号位于同一嵌套层)。