删除对象

时间:2013-01-01 20:52:36

标签: c++ pointers new-operator

我是新手,只是想问一个关于删除对象的快速问题。

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

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

MyClass1::~MyClass1()
{

delete MyClassA;
delete MyClassB;

}

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

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

谢谢

5 个答案:

答案 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 ++中的动态内存由您控制,这就是我们被赋予newdelete的原因(因为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;
};