从对象的方法或另一个 class 构造函数中删除对象是否被认为是不好的做法?

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

我有一个class A,它的对象存储了一个指针。

这个 class 的对象将在另一个 class (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;
}

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

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

因此,当您仅像示例中那样使用它时,您应该使 "delete" 靠近 "new" 并且可见。可能有一些原因导致您无法执行此操作,并且您必须在获得所有权时清楚地对此进行评论。

与在构造函数中分配对象相同,在相同的地方删除它们 class 等

然而:

自从您标记此 c++11。有智能指针可以显示您的意图并帮助您做到这一点。

如果你只希望一个实例有 "ownership" 你可以使用 std::unique_ptr<A> 并将其移动到 class B。然后它将删除 [=12] 的实例=] 当 B 被破坏时自动。

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

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

如果你可以更喜欢 unique_ptr 而不是 shared_ptr

对象删除自身是完全可以的,参见Is delete this allowed?

更大的问题是这是否是个好主意。在这种情况下,您的主要代码是使用 new 创建一个新的 A 对象。您会期望看到与之相匹配的 delete,而将其隐藏在对象本身中是一种代码味道。

B 是否需要处理 A 之前分配的内存?

第一种方法

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

第二种方法

使用来自 STL、boost 或实现您自己的智能指针

第三种方法

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