【发布时间】:2011-05-03 22:41:23
【问题描述】:
可能重复:
How could pairing new[] with delete possibly lead to memory leak only?
总是有人告诉我,在使用 new[] 分配的数组上调用 delete 是不安全的。您应该始终将 new 与 delete 以及 new[] 与 delete[] 配对。
所以我惊讶地发现下面的代码在VS2008下的Debug和Release模式下都编译运行正常。
class CBlah
{
public:
CBlah() : m_i(0) {}
private:
int m_i;
};
int _tmain(int argc, _TCHAR* argv[])
{
for(;;)
{
CBlah * p = new CBlah[1000]; // with []
delete p; // no []
}
return 0;
}
我花了一段时间才弄清楚为什么这会起作用,我认为这只是运气和一些未定义的行为。
但是...这让我想知道...为什么 Visual Studio 不选择它,至少在调试内存管理器中?是因为有很多代码会犯这个错误而他们不想破坏它,还是他们觉得捕捉这种错误不是 Debug 内存管理器的工作?
有什么想法吗?这种滥用常见吗?
【问题讨论】:
-
这是一个逻辑错误,编译器无法检测到。不过,好的 IDE 可以发现这些。
-
这个问题stackoverflow.com/questions/1913343/… 彻底解释了所有细节。是的,这是一个典型的错误。
-
@Hans Passant:不,数组没有泄露,这是UB。我链接到一个问题,该问题详细解释了所有内部工作原理。
-
使用
std::vector,不要手动删除东西。
标签: c++ memory-management