是否有必要为char数组调用delete [] vs delete?

时间:2010-09-09 22:43:27

标签: c++

我正在使用由同事撰写的图书馆,并发现valgrind正在喷出与delete相关的错误。

问题是有像

这样的char数组的分配
char* s = new char[n];

稍后跟着delete s

而不是delete[] s

他告诉我,差异实际上是delete[] s将在s中的每个位置调用对象的析构函数(如果有的话),在这种情况下它不会因为它是一个原始类型。我相信这是真的。

所以删除s并不是真正的错误,而valgrind只是非常彻底。

它是否仍然可以释放与s相关的所有内存?

3 个答案:

答案 0 :(得分:22)

如果使用new[]分配数组,则必须使用delete[]销毁它。通常,函数operator delete(void*)operator delete[](void*)不能保证相同。

参考here

答案 1 :(得分:8)

标准没有说明内存将如何被删除 - 它只是说不匹配正确的删除与正确的删除是未定义的行为。

实际上,new[]后面跟着delete通常会释放用new[]分配的所有内存,但是没有正确调用该数组中项目的析构函数。 (大部分时间 - 不是标准规定的那样)

您应该考虑使用vector

,而不是动态分配数组

答案 2 :(得分:8)

忘记析构函数。 new/deletenew[]/delete[]之间的区别在于它们是两个完全不相关的独立内存分配机制。他们不能混在一起。使用delete取消分配用new[]分配的内存与使用free用于相同目的没有什么不同。