我正在使用一个由同事写的图书馆,并发现它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吗?
该标准没有说明内存将如何被删除 - 它只是说不匹配正确的新的正确的删除是未定义的行为.
实际上,new[]后面delete通常会释放分配的所有内存new[],但是没有正确调用该数组中项目的析构函数.(大多数时候 - 不是标准规定的那个)
而不是动态分配数组,你应该考虑使用vector.
忘记析构函数.new/delete和之间的区别在于new[]/delete[]它们是两个完全不相关的独立内存分配机制.他们不能混在一起.使用delete以收回与分配的内存new[]并不比使用不同的free为同一目的.