如何正确删除指向数组的指针

dom*_*lao 9 c++

我是C++的新手,我对数组和指针感到困惑.有人能告诉我如何正确删除指针.例如,

int *foo;
foo = new int[10];

delete foo;
Run Code Online (Sandbox Code Playgroud)

要么

delete [] foo;
Run Code Online (Sandbox Code Playgroud)

谢谢.

Jer*_*fin 19

将new []与delete []匹配的要求在技术上是正确的.

然而,更好的是忘记你曾经听说过新的[],再也不会再使用它了.我很确定自从上次使用新[]以来已经(至少)10年了,如果我对这种情况了解得很清楚,我就会早点停下来.几乎任何时候你甚至考虑使用new [],std :: vector(或者可能是std :: deque)将是更好的选择.

  • 全面禁止将是新的[],而不是新的.集合类(包括字符串)应该调用:: new(size_t); 直.当你使用new []时,它会创建一个对象数组 - 即所有这些位置都被分配和构造.集合不应该在空的空间中创建对象(对于字符串来说只是没有意义,如果对象构造起来很昂贵,则会产生积极的影响).相反,它应该分配未初始化的存储,然后使用placement new在该存储中创建对象. (4认同)
  • 如果你试图建立一个字符串类,或者类似的东西怎么办?新毯子禁令很糟糕. (3认同)

ale*_*gle 8

它的:

delete[] foo;
Run Code Online (Sandbox Code Playgroud)

编辑:现代编译器确实需要您使用正确的delete运算符,否则它们可能会泄漏内存或无法运行正确的析构函数.

(我之前曾说过,它在实践中没有什么区别.大约10年前,我尝试了许多不同的编译器,如果你错误地省略了它,却找不到实际泄露内存的编译器[].但是暴徒的嚎叫 - 见下文 -迫使我重新尝试我的实验,似乎现代编译器/ libc ++真的很关心.)

  • 编译器可能不会泄漏内存,但如果没有`[]`,他们可能不会调用析构函数... (10认同)
  • 即使编译器使用`delete`做正确的事情,我认为使用`delete []`仍然是更好的做法 - 既适用于遇到不做正确事情的编译器,也适用于意图声明. (2认同)
  • @alex:它__WILL__泄漏内存.但是因为你使用了错误的删除,你搞砸了内存管理例程使用的内部内存结构.因此很可能任何尝试和监视内存泄漏的工具都不会报告它. (2认同)

Nic*_*ord 5

如果使用new []运算符分配对象数组,则必须使用delete []运算符,因此非数组new只能与非数组一起使用delete.

int *a = new int[10];
int *b = new int;

delete [] a;
delete b;
Run Code Online (Sandbox Code Playgroud)