从对象的方法或其他类构造函数中删除对象是否被视为不良做法?
Is deleting an object from that object's method or from another class constructor considered bad practice?
我有一个类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使用。对象的析构函数将在框架的末尾被调用(右括号位于同一嵌套层)。
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- C - 空数对象的初始化发送不良访问错误
- 在检查对象类型的情况确实总是符合不良设计的迹象
- 强制转换为父类对象而不是引用时会出现哪些不良结果
- 向上转换为基类对象而不是引用有什么不良影响
- 从对象的方法或其他类构造函数中删除对象是否被视为不良做法?
- VTK 6.1和Qt 5.3: 3D对象在QVTKWidget与不良透明度
- 自定义对象在 std::sort 之后的不良行为