【问题标题】:Is c++ delete [] applicable to primitive typesc++ delete []是否适用于原始类型
【发布时间】:2017-07-18 22:48:56
【问题描述】:

在 C++ 中,如果我有一个动态分配的原始类型数组,是否有必要使用 delete [] 来防止内存泄漏? 例如,

char * x = new char[100];
delete x; // is it required to call delete [] x?
struct A {
 ...
};
A *p = new A[30];
delete [] p; // delete p would cause memory leakage

请发表评论。

【问题讨论】:

  • "有一个为原始类型动态分配的数组" 不要。使用 std::vector。

标签: c++ memory-leaks new-operator dynamic-memory-allocation delete-operator


【解决方案1】:

使用new运算符的数组形式时,必须使用delete运算符的数组形式。

char * x = new char[100];
delete [] x;

char * y = new char;
delete y;

newdelete 一起使用的形式不依赖于开始分配和释放的对象类型。

如果你使用

A *p = new A[30];
delete [] p;

程序受到未定义行为的影响。它可能会导致内存泄漏并继续运行,但也可能会崩溃。

【讨论】:

    【解决方案2】:

    是的。 delete [] 运算符只是告诉编译器删除数组的所有元素,而不仅仅是第一个元素。这适用于所有类型,包括整数和非整数。

    【讨论】:

    • 如果我使用delete而不是delete [],这是否意味着原始类型。会不会有内存泄漏?你能参考一些文档/链接来检测这个吗?
    • @Dr.DebasishJana 文档是 c++ 标准。
    • @Dr.DebasishJana 没有人可以保证杰克蓝精灵会发生什么。这就是未定义行为的美妙之处。该标准基本上是在说“在我们告诉你不要这样做之后这样做是一个糟糕的主意,以至于我们不会浪费时间来定义会发生什么。”也许你得到了泄漏。也许你不会。也许程序会崩溃。也许它会在随机文件上写入 1 和 0 的随机模式。你不知道。我们不知道。行为未定义。
    【解决方案3】:

    是的,因为语言需要它。

    当数组是标量类型时,如果您不小心使用了delete 而不是delete[],那么您的程序很可能仍然可以工作。但它仍然是未定义的行为——标准不保证它可以工作,并且你的编译器的下一个版本可能会破坏你的程序。

    【讨论】:

      【解决方案4】:

      如果你通过new T[n]分配内存,那么你必须通过delete[]删除它。

      参考Faq问题。

      【讨论】:

        【解决方案5】:

        Dynamic memory in C++.

        pointer = new T
        pointer = new T [number_of_elements]
        

        第一个表达式用于分配内存以包含T 类型的单个元素。第二个用于分配 T 类型的元素块(数组),其中 number_of_elements 是表示这些元素数量的整数值。例如:

        1.  int * foo;
        2.  foo = new int [5]; 
        

        在下面的语句中,第一个语句释放使用 new 分配的单个元素的内存,第二个语句释放使用 new 和括号 ([]) 中的大小为元素数组分配的内存。

        1. delete pointer;
        2. delete[] pointer;
        

        【讨论】:

          【解决方案6】:

          运算符delete的形式必须与运算符new的形式对应。因此,分配有AnyType *x = new AnyType[n] 的数组必须使用delete [] x 释放。以任何其他方式释放(如delete x)会产生未定义的行为。适用于任何类型 - 原始或非原始类型。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-12-17
            • 1970-01-01
            • 1970-01-01
            • 2023-03-19
            • 1970-01-01
            • 1970-01-01
            • 2011-01-27
            相关资源
            最近更新 更多