数组

  也可以用new建立对象的数组。例如,

    char* save_string(const char* p)
    {
        char* s = new char[strlen(p) + 1];
        strcpy(s, p);        // 从p复制到s
        return s;
    }

    int main(int argc, char* argv[])
    {
        if(argc < 2) exit(1);
        char* p = save_string(argv[1]);
        // ...
        delete [] p;
    }

“简单的” delete运算符只能用于删除单个的对象,删除数组需要用delete[]。

  为了释放由new分配的空间,delete和delete[]必须能够确定为对象分配的空间大小。这也意味着通过标准实现的new分配的对象将占用比静态对象稍微大一点的空间。在典型情况下需要用一个机器字保存对象的大小。

  请注意,一个vector(3.7.1节、16.3节)是一个普通对象。因此可以用简单的new和delete分配和释放。例如,

    void f(int n)
    {
        vector<int>* p = new vector<int>(n);        // 单个的对象
        int* q = new int[n];                        // 数组
        // ...
        delete p;
        delete[] q;
    }

delete[] 运算符只能应用于由new返回的到一个数组的指针或者0,应用到0时不会产生任何影响。

注意⚠️:为了使delete能正确的释放由new分配的空间,请不要移动指针的位置。 —-沈军注

🔚