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

Mat*_*att 6 c++

我正在使用一个由同事写的图书馆,并发现它valgrind正在喷出与之相关的错误delete.

问题是有像char数组的分配

char* s = new char[n];
Run Code Online (Sandbox Code Playgroud)

随后跟进 delete s

代替 delete[] s

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

所以删除s本身并不是一个真正的bug,而且valgrind只是非常彻底.

它还能完全释放与之相关的所有内存s吗?

Mic*_*son 22

如果使用分配数组new[],则必须使用它来销毁它delete[].在一般情况下,功能operator delete(void*)operator delete[](void*)不能保证是相同的.

请参考这里


Bil*_*eal 8

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

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

而不是动态分配数组,你应该考虑使用vector.


AnT*_*AnT 8

忘记析构函数.new/delete和之间的区别在于new[]/delete[]它们是两个完全不相关的独立内存分配机制.他们不能混在一起.使用delete以收回与分配的内存new[]并不比使用不同的free为同一目的.