【问题标题】:Different ways to deallocate an array - c++释放数组的不同方法 - C++
【发布时间】:2017-03-02 04:15:16
【问题描述】:

如果你说过

int *arr = new int[5];

有什么区别

delete arr;

delete [] arr;

我问这个是因为我试图释放二维数组的内存并且

delete [][] arr; 

似乎没有用,但是

delete arr;

似乎工作正常

提前谢谢你!

【问题讨论】:

  • 这是一个自动或静态数组。在任何一种情况下,调用deletedelete[] 都是未定义的行为。因此,“差异”是无关紧要的。 都不正确。你的书/教程是否认真地指出了你的方向?因为如果是这样,请换一个。 Related question here.
  • 对不起,我的意思是 arr 是一个指针。但是是的,我的教科书建议我们对数组使用 delete [] arr。
  • 当然是在 dynamic 数组上。在自动数组上,no。简而言之,如果你newdelete,如果你new [n]delete[]。就是这样。
  • 了解我误解了数组中维度的括号。那么 delete [] 数组对于二维数组也是一种好习惯吗?
  • 再一次,如果你使用了array-new,那么使用array delete。如果您拥有的“事物”被分配了某种形式的new [],那么将使用delete []。坦率地说,没有一个是理想的in modern c++ anyway

标签: c++ arrays memory-management


【解决方案1】:

new type 需要 delete
new type[size] 需要 delete []
用一个代替另一个是错误的。

顺便说一句,除非你有充分的理由,否则你不应该使用这样的原始指针。请改用std::vectorstd::array

2D MxN 数组通常应线性化为 1D M*N 数组,同样使用这些容器。

【讨论】:

  • 谢谢,我是矢量的粉丝,但这是在某些硬件中引入的,有点令人困惑!
【解决方案2】:

如果你说过

int arr[5];

有什么区别

delete arr;

delete [] arr;

其中有一对额外的括号。两者都可能会崩溃和/或损坏堆。这是因为 arr 是一个局部变量,不能是 deleted - delete 仅适用于分配有 new 的东西。

delete [][] arr; 不是有效的语法。对于分配有例如new int[2][2] 的数组,请使用delete []

【讨论】:

    【解决方案3】:

    删除的都不正确。

    当你像这样声明一个数组时:

    int arr[5];
    

    空间分配在stack。堆栈上分配的内存不会被删除清除。当堆栈在范围退出时展开时,它会自动清理(尽管从技术上讲 clean 不是正确的术语)。 (查看When is an object "out of scope"?

    如果你像这样声明你的数组:

    int *arr = new int[5]; // new allocates memory on heap
    

    你打电话

    delete[] arr; // this takes care of cleaning up memmory on **heap**
    

    【讨论】:

    • 对不起,我的意思是 int *arr = new int[5];
    【解决方案4】:

    我假设您的意思是 new int[5],同样的 new 用于动态内存。否则,您使用的是堆栈,而不是堆,并且删除未定义

    虽然delete arr 似乎适用于二维数组,但我相信该标准需要以下内容:

    delete [] arr
    arr=nullptr
    

    这是因为用new [] 分配的内存必须用delete [] 释放,反之亦然。此外,留下悬空指针很危险,因此最后一行

    【讨论】:

    • 好的,你认为'delete arr'可能只删除数组的行而不是列吗?
    • 哦。对不起。我在那里犯了一个错误。我忘记了我包含在数组中
    猜你喜欢
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2011-03-01
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多