【问题标题】:Must I delete a static array in C++?我必须在 C++ 中删除一个静态数组吗?
【发布时间】:2013-01-31 01:49:27
【问题描述】:

我正在写一些这样的代码:

while(true) {
    int array[5];
    // do something
}

对于循环的每一轮,数组都是一个新数组。我需要在循环结束时删除数组吗?

【问题讨论】:

  • 经验法则:每个new 对应一个delete;每个new[] 恰好有一个delete[]。
  • 这个问题已经被问过很多次了,几乎都以完全相同的形式出现。小指规则...首先寻找重复,特别是如果这是一个简单的问题。

标签: c++ arrays memory-management


【解决方案1】:

我需要在循环结束时删除数组吗?

否,您不需要删除它,因为array 具有自动存储期限。当退出每个while循环时,它会被释放。

您需要成对拨打delete [] / new []和delete / new。

【讨论】:

  • @dtc 不,你不能删除不是新的对象。
【解决方案2】:

没有。

在堆栈上声明的变量不需要手动释放。您的数组在 while 循环内。对于循环的每次迭代,数组都会在堆栈上分配,然后自动释放。

只有使用new[] 声明的数组必须使用delete[] 手动释放

此外,您声明的数组在任何意义上都不是static。 static 关键字在 C 中具有特定含义。您声明的数组实际上存储为 auto(自动存储)变量,这意味着它在超出范围时会自动释放。

【讨论】:

    【解决方案3】:

    其他答案已正确解释 delete 是不必要的,因为您的数组在堆栈上,但他们没有解释堆栈是什么。这里有一个非常好的解释:What and where are the stack and heap?

    因为它适用于您的问题:在 C 和 C++ 中,除非您明确告诉编译器,否则您的变量将放置在堆栈中,这意味着它们仅存在于它们所在的范围(即块)内重新声明。显式告诉编译器将某些内容放在堆上的方法是使用malloc(C 方式)或new(C++ 方式)。只有这样您才需要调用free(C 语言)或delete/delete[](C++)。

    【讨论】:

    • 是的,可能是这样,因为“删除”在应用于堆栈上的变量时应该没有任何意义。你能提出一个更好的措辞吗?
    • (我之所以这么说,是因为最初的问题是“我是否需要删除数组”,即是否有必要这样做,并且答案是否定的,没有必要。)
    • 是的,我的意思是堆。谢谢。虽然这作为评论比对旧评论的编辑更有帮助,因为我实际上并没有收到关于编辑的通知。
    【解决方案4】:

    您不能(除非您使用一些复杂的程序集)并且不需要删除分配在堆栈上的数组或对象。

    如果由于某种原因您觉得需要删除创建的数组,:

    int *array = new int[5];
    //do something
    delete[] array;
    

    另外,我的建议是使用 std::vector 而不是数组。

    【讨论】:

    • 为什么你会一直使用标准库中的东西,甚至不知道应用程序是什么?
    猜你喜欢
    • 2017-03-12
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多