我是新手,只是想问一个关于删除对象的快速问题。
我有一个名为MyClass1的对象,从中我有许多其他类,MyClassA,MyClassB等。
现在我应该在MyClass1中执行此操作:
MyClass1::~MyClass1()
{
delete MyClassA;
delete MyClassB;
}
或者,当我删除MyClass1时,会自动删除在MyClass1中创建的所有内容吗?
另外,如果我在MyClassA和MyClassB中创建了更多对象,那么它们是否也必须在各自的类中手动删除?
谢谢
答案 0 :(得分:4)
如果你问这个,你只是在学习C ++,所以最好的建议是 - 不是。您应该了解这些内容(动态分配和内存管理 - 请参阅Guillaume的答案),但真正应该做的是使用 RAII (google this)。正确的C ++方式是:
struct MyClass1
{
MyClassA mA;
std::shared_ptr<MyClassB> mB;
MyClass1() : mB(new MyClassB)
{
}
};
请参阅?没有更多的析构函数,这意味着你也不需要复制构造函数或复制赋值运算符(这是Guillaume的答案存在缺陷的地方 - 它缺少最后两个)。
答案 1 :(得分:3)
仅在您使用delete
运算符
new
运算符
struct MyClass1
{
MyClassA mA;
MyClassB * mB;
MyClass1()
{
mB = new MyClassB;
}
~MyClass1()
{
delete mB;
}
};
答案 2 :(得分:1)
您无法删除非指针的对象,因为这不是delete
的目的。它意味着释放与对象关联的动态内存。也就是说,必须删除使用new
创建的任何内容。您可以指向类,也可以删除它们。但由于new
没有分配任何内容,因此无需使用delete
。实际上,该类将在创建它的范围的末尾从内存中被破坏。当动态内存在堆上时,这些对象在堆栈上分配。堆栈上的对象具有自动存储持续时间(在其范围的末尾删除,除非其声明为static
,在这种情况下它具有"static" storage duration);此外,堆上的对象具有动态存储持续时间。 C ++中的动态内存由您控制,这就是我们被赋予new
和delete
的原因(因为C ++希望我们自己处理内存)。否则删除未使用new
构造的对象是未定义的行为,可能会导致崩溃。
答案 3 :(得分:0)
delete
适用于对象,而不适用于类。通常,只有在调用delete
来创建对象时,才需要调用new
(或安排自动调用,通过共享指针,或通常使用RAII惯用法)。一些(库?)调用的返回值是一个对象,(库的?)文档明确声明调用者必须用delete
处理(在这种情况下,将调用视为包装器)在你负责的new
附近。)当然,如果可能的话,应该避免这样的API。
答案 4 :(得分:0)
如果是Qt,请使用QPointer
!它是一个智能指针:析构函数中不需要任何东西。
#include <QPointer>
class MyClass1
{
QPointer<MyClassA> pA;
QPointer<MyClassB> pB;
};