以错误的方式删除数组

ben*_*ben 4 c++ memory-management

可能重复:
如何将new []与delete配对可能只会导致内存泄漏?

我总是被告知在使用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;
}
Run Code Online (Sandbox Code Playgroud)

我花了一段时间才弄清楚它为什么会起作用,我认为这只是运气和一些未定义的行为.

但是......它让我想知道......为什么Visual Studio没有选择这个,至少在Debug内存管理器中呢?是因为有很多代码出现了这个错误并且他们不想破坏它,或者他们觉得调试内存管理器的工作不是要抓住这种错误吗?

有什么想法吗?这种滥用是否常见?

Arm*_*yan 9

它肯定会编译好,因为指针(编译时)中没有信息,它会看到指针指向数组还是什么.例如:

int* p;

cin>>x;
if(x == 0)
  p = new int;
else
  p = new int [10];

delete p; //correct or not? :)
Run Code Online (Sandbox Code Playgroud)

现在,关于运行正常.这在C++中称为未定义行为,也就是说,无法保证会发生什么 - 一切都可以运行正常,你可以得到段错误,你可以得到错误的行为,或者你的计算机可能决定拨打911. UB <=>不保证

  • 堆损坏的原因是*非常糟糕*,当它崩溃或以其他方式破坏时,它会在某个点*距离错误的位置*这样做...如果你不快速接受这个,你将花费数小时或数天试图调试可能是完美的代码,而不是意识到真正的错误可能在程序的完全不同的部分. (2认同)

Chu*_*dad 3

这是未定义的行为,在爱情、战争和未定义的行为中一切都是公平的......:)