我正在使用由同事撰写的图书馆,并发现valgrind
正在喷出与delete
相关的错误。
问题是有像
这样的char数组的分配char* s = new char[n];
稍后跟着delete s
而不是delete[] s
他告诉我,差异实际上是delete[] s
将在s
中的每个位置调用对象的析构函数(如果有的话),在这种情况下它不会因为它是一个原始类型。我相信这是真的。
所以删除s并不是真正的错误,而valgrind
只是非常彻底。
它是否仍然可以释放与s
相关的所有内存?
答案 0 :(得分:22)
如果使用new[]
分配数组,则必须使用delete[]
销毁它。通常,函数operator delete(void*)
和operator delete[](void*)
不能保证相同。
参考here
答案 1 :(得分:8)
标准没有说明内存将如何被删除 - 它只是说不匹配正确的删除与正确的删除是未定义的行为。
实际上,new[]
后面跟着delete
通常会释放用new[]
分配的所有内存,但是没有正确调用该数组中项目的析构函数。 (大部分时间 - 不是标准规定的那样)
您应该考虑使用vector
。
答案 2 :(得分:8)
忘记析构函数。 new/delete
和new[]/delete[]
之间的区别在于它们是两个完全不相关的独立内存分配机制。他们不能混在一起。使用delete
取消分配用new[]
分配的内存与使用free
用于相同目的没有什么不同。