ben*_*ben 4 c++ memory-management
我总是被告知在使用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内存管理器中呢?是因为有很多代码出现了这个错误并且他们不想破坏它,或者他们觉得调试内存管理器的工作不是要抓住这种错误吗?
有什么想法吗?这种滥用是否常见?
它肯定会编译好,因为指针(编译时)中没有信息,它会看到指针指向数组还是什么.例如:
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 <=>不保证
| 归档时间: |
|
| 查看次数: |
2098 次 |
| 最近记录: |