C++删除语句的动态是什么?

Mik*_*ebb 4 c++ new-operator delete-operator

这仅仅是出于好奇的缘故,因为我没有使用过new,并delete在C++中,除了最基本的用途.

我知道delete释放记忆.我想知道的是它如何处理更复杂的案件?

例如,如果我有一个这样的用户定义的类:

class MyClass
{
public:
    MyClass();
    ~MyClass()
    {
        delete [] intArray;
    }
    //public members here
private:
    int* intArray;
};
Run Code Online (Sandbox Code Playgroud)

假设类以某种方式为内存分配内存intArray,然后在析构函数中释放它,如果我像这样使用类,那么:MyClass* myClass = new MyClass();稍后发布它delete myclass;

如何delete处理释放所有内存?是否首先调用类析构函数以释放由类(即int* intArray)分配的所有内存,然后释放分配用于保存类的内存?

如果我有这样的课程怎么办?

class MyClass
{
public:
    MyClass();
    ~MyClass()
    {
        delete anotherMyClass;
    }
    //public members here
private:
    MyClass* anotherMyClass;
};
Run Code Online (Sandbox Code Playgroud)

假设anotherMyClass没有使用构造函数分配,这会很快耗尽内存,如果有一个MyClasses链如链接列表那么相互附加怎么办?析构函数中的delete语句是否适用于这种情况?anotherMyClass当析构函数被调用时,每个都会被递归释放吗?

您知道的newdelete陈述是否有任何特定的奇怪技巧或警告?

Jam*_*lis 10

给定一个p动态分配对象的指针(),delete做两件事:

  1. 它调用动态分配对象的析构函数.请注意,~MyClass()完成后,将调用类类型的任何成员变量的析构函数.
  2. 它释放了动态分配的对象占用的内存.

它不会搜索对象的成员变量以获取其他指向free的指针; 它没有释放任何其他内存,也没有做任何其他事情.

如果你需要释放指向的内存intArray,你需要delete在析构函数中使用它MyClass.

但是,在几乎所有的C++代码中,您都不必担心这一点.您应该使用智能指针一样shared_ptr,unique_ptr,auto_ptr,和scoped_ptr自动管理动态分配的对象.手动资源管理最多是困难的,应尽可能避免.

这是更广泛的习语,范围限制资源管理(SBRM,也称为资源获取是初始化,或RAII)的一部分.这是迄今为止最重要的设计模式,可以在C++代码中随处理解和使用.

如果在你的课堂上你已经宣布了这个:

boost::scoped_ptr<int> intArray;
Run Code Online (Sandbox Code Playgroud)

然后当scoped_ptr<int>对象被销毁时,它将释放它所持有的指针.然后,您无需手动销毁对象.

在编写良好的现代C++代码中,您应该很少需要手动使用delete.应使用智能指针和其他SBRM容器来管理需要清理的任何类型的资源,包括动态分配的对象.


在第二个示例中,给出了一个如下链接列表:

x -> y -> z -> 0
Run Code Online (Sandbox Code Playgroud)

你会得到一个如下所示的操作顺序:

delete x;
  x.~MyClass();
    delete y;
      y.~MyClass();
        delete z;
          z.~MyClass();
            delete 0;
          [free memory occupied by z]
      [free memory occupied by y]
  [free memory occupied by x]
Run Code Online (Sandbox Code Playgroud)

链表中的对象将以相反的顺序销毁.