0

我对此很陌生,只是想问一个关于删除对象的快速问题。

我有一个名为 MyClass1 的对象,从中我有许多其他类,MyClassA、MyClassB 等。

现在我应该在 MyClass1 中执行此操作:

MyClass1::~MyClass1()
{

delete MyClassA;
delete MyClassB;

}

或者当我删除 MyClass1 时会自动删除 MyClass1 中创建的所有内容吗?

另外,如果我在 MyClassA 和 MyClassB 中创建了更多对象,是否也必须在各自的类中手动删除这些对象?

谢谢

4

5 回答 5

4

如果你问这个,你只是在学习 C++,所以最好的建议是 - 两者都不是。您应该了解这些东西(动态分配和内存管理 - 请参阅 Guillaume 对此的回答),但您真正应该做的是使用RAII(google this)。正确的 C++ 方法是:

struct  MyClass1
{
  MyClassA mA;
  std::shared_ptr<MyClassB> mB;

  MyClass1() : mB(new MyClassB)
  {

  }
};

看?不再需要析构函数,这意味着您也不需要复制构造函数或复制赋值运算符(这是 Guillaume 的答案存在缺陷的地方 - 它缺少最后两个)。

于 2013-01-01T21:02:30.087 回答
3

delete仅当您使用运算符创建对象时才调用运算new

struct  MyClass1
{
  MyClassA mA;
  MyClassB * mB;

  MyClass1()
  {
    mB = new MyClassB;
  }

  ~MyClass1()
  {
    delete mB;
  }
};
于 2013-01-01T20:56:27.607 回答
1

您不能删除不是指针的对象,因为这不是delete. 它旨在释放与对象关联的动态内存。也就是说,new必须删除任何创建的内容。您可以拥有指向类的指针,并且它们可以被删除。但是由于没有分配任何东西new,所以没有必要使用delete. 实际上,该类将在创建它的范围结束时从内存中销毁。这些对象在堆栈上分配,而动态内存在堆上。堆栈上的对象具有自动存储持续时间(在其范围末尾删除,除非它声明static在这种情况下它具有“静态”存储持续时间); 此外,堆上的对象具有动态存储持续时间。C++ 中的动态内存由您控制,这就是我们被赋予的原因newdelete因为 C++ 期望我们自己处理内存)。否则,删除未构造的对象new是未定义的行为,可能会导致崩溃。

于 2013-01-01T21:10:34.607 回答
0

delete应用于对象,而不是。通常,仅当您调用创建对象时,才需要调用delete(或安排通过共享指针或通常使用 RAII 习惯用法自动调用它) 。new例外情况是某些(库?)调用的返回值是(库的?)文档明确声明调用者必须处理的对象(在这种情况下,将调用视为您拥有delete的 a 的包装器)new成为负责。)当然,如果可能的话,应该避免使用这样的 API。

于 2013-01-01T21:34:22.847 回答
0

如果是 Qt,请使用QPointer! 它是一个智能指针:析构函数中不需要任何东西。

#include <QPointer>

class MyClass1
{
  QPointer<MyClassA> pA;
  QPointer<MyClassB> pB;
};
于 2013-01-01T23:05:17.327 回答