how to properly delete a pointer to array
我是C++新手,我对数组和指针感到困惑。有人能告诉我如何正确删除一个指针吗?比如说,
1 2 3 4
| int *foo;
foo = new int[10];
delete foo; |
或
谢谢。
- 如果所有的答案都是正确的,我怎么能接受所有的答案呢?我不喜欢只选一个,因为所有的答案都很好地回答我的问题。
- 你不能全部接受。如果你觉得他们都有帮助的话,你可以全部投赞成票,但是你应该接受一个。常见问题解答中建议了验收标准,但可能包括正确性、有用性、完整性等。
将新的[]与删除的[]匹配的要求在技术上是正确的。
然而,更好的办法是忘记你曾经听说过新的[],不要再使用它。我很肯定,我上次使用新的[]已经(至少)10年了,如果我能很好地了解情况,我会更快地停止使用。STD::矢量(或者STD::DEQE)将是一个更好的选择。
- 如果您试图构建一个字符串类,或者类似的有用的类,该怎么办?禁止穿新衣服是不好的。
- 全面禁止将是新的,而不是新的。集合类(包括字符串)应直接调用::new(size_t;)。当使用new[]时,它会创建一个对象数组——即所有这些位置都是分配和构造的。集合不应在空白空间中创建对象(对于字符串来说,这是毫无意义的,如果对象的构造成本很高,这是非常有害的)。相反,它应该分配未初始化的存储,然后使用placement new在该存储中创建对象。
它是:
编辑:现代编译器确实需要您使用正确的delete操作符,否则它们可能会泄漏内存或无法运行正确的析构函数。
(我之前说过,这在实践中没有什么不同。大约10年前,我尝试了许多不同的编译器,但如果您错误地忽略了[],就找不到一个真正泄漏内存的编译器。然而,暴徒的怒吼——见下文——迫使我重新尝试我的实验,而且似乎现代编译器/libc++s真的很在意。)
- 即使编译器对delete做了正确的事情,我认为使用delete []仍然是更好的实践——无论是在遇到不做正确事情的编译器的情况下,还是作为意图声明。
- 编译器可能不会泄漏内存,但如果没有[],它们可能不会调用析构函数…
- 我想我从来没有见过一个编译器允许你在需要删除时使用delete。它们总是生成在我执行时会爆炸的代码。
- @亚历克斯:它会泄露内存。但是由于使用了错误的删除操作,导致内存管理例程使用的内部内存结构混乱。因此很有可能,任何试图监视内存泄漏的工具都不会报告它。
- 当您使用带有普通DTR的类型时,它们可能不会泄漏内存。然而,对于具有非平凡DTR的UDT,这是完全不同的,因为delete不会调用所有DTR。
- 谢谢你指出我的错误-现在改正了。显然,C++编译器/运行时间比我在上个世纪尝试这个实验时更复杂。
- 至少Visual C++ 8将能够检测数组/非数组新和删除之间的不匹配(当调用/分析开关时)。如果使用了错误的删除(对于带有析构函数的类),则生成的程序将泄漏。
如果使用new []运算符分配对象数组,则必须使用delete []运算符,因此非数组new只能与非数组delete一起使用。
1 2 3 4 5
| int *a = new int[10];
int *b = new int;
delete [] a;
delete b; |
如果你做new [],你必须做delete []。这是一个足够简单的规则,值得记住。
任何时候当你使用一个数组时,你都会使用一个数组。有时,您使用new创建了一个数组,然后您仍然需要使用delete[],这是不可能的。所以这不是一条规则"新建时使用delete[]"而是"删除数组时使用delete[]"。
1 2 3 4
| typedef int array[5];
int *a = new array;
delete[] a; // still delete[] ! |
你走进前门,让它开着。然后你走到后门试图关上它,但你把它砸碎了,因为它已经关上了。
2
别把它们弄混了!