【发布时间】:2018-04-17 02:27:28
【问题描述】:
我有一个关于从堆内存中删除数组的问题。在一本书和this blog 和其他资源such as this one 中,我读到要从堆中删除一个数组,我们必须在delete 关键字之后使用[],这样如果我们不使用[],我们会有内存泄漏。
例如,考虑下面的代码。
//constructing array
int *s = new int[10];
// deleting array from heap
delete [] s;
我在 Linux 中测试了这个小程序,使用 valgrind 包来检查有多少内存泄漏是由错误的编码引起的。在Linux中通过以下命令,我看到一切都很好
sudo valgrind --leak-check=full ./<path_to_exe_file>
这是 Linux 命令的输出
==4565== HEAP SUMMARY:
==4565== in use at exit: 0 bytes in 0 blocks
==4565== total heap usage: 1 allocs, 1 frees, 40 bytes allocated
==4565==
==4565== All heap blocks were freed -- no leaks are possible
但是,当我尝试使用 delete 而不使用 [] 时,我的问题出现了。 valgrind 的输出显示所有堆内存已被释放。它是否正确?或valgrind 没有意识到堆没有被释放并且数组的某些部分仍然在那里!!?如果valgrind无法检测到这种内存泄漏,有没有其他包可以检测到这种情况?
【问题讨论】:
-
int *s = new int[10]; delete s;给出未定义的行为。运算符delete的形式需要与运算符new的形式相匹配。未定义行为的一种可能表现形式是按照您的预期运行,例如您所看到的。使用另一个编译器,它可能会以不同的方式运行,或者根本不运行。 -
delete你是什么new-ed 和delete[]你是什么new[]-ed。或者甚至更好地使用智能指针。 -
将
int替换为std::vector<int>或std::string以查看您的 UB 程序中的预期泄漏。 -
表达式中的空格对编译器没有影响,只对人类有影响。
-
如果我使用
[],使用std::vector<int>很奇怪,部分内存已经丢失。 @Jarod42
标签: c++ arrays memory-leaks valgrind