从对象的方法或另一个 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。对象的析构函数将在框架的末尾调用(同一嵌套级别的右括号)。
我有一个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。对象的析构函数将在框架的末尾调用(同一嵌套级别的右括号)。