可能重复:
Is it necessary to call delete[] vs delete for char arrays?
char *p = new char[200];
delete p;
这种(我更改了var名称)代码来自一个大型商业项目。
第三行。这是正确的吗? 我应该改变它还是留在那里。 Coz没有错误报告,这个程序运行超过4年。
感谢。
答案 0 :(得分:5)
您 使用delete[]
因为您使用了new[]
,所以它不是替代方案。
delete [] p;
答案 1 :(得分:3)
如果new
使用[]
,则必须删除它:
T *p = new T[100];
delete [] p; //correct
delete p ; //incorrect
如果new
未使用[]
,则删除也不得使用它:
T *p = new T;
delete [] p; //incorrect
delete p ; //correct
不正确并不意味着您将收到编译错误;这也不意味着程序必须在运行时失败。这意味着,程序行为未定义;一切皆有可能,而且很可能会有内存泄漏。
答案 2 :(得分:2)
理论上,要遵循标准,第3行应为delete[] p;
。
但是,实际上这没有任何意义,因为char的析构函数什么都不做。
确实,删除和数组删除之间的区别在于,对于数组删除,析构函数被调用的次数与对象一样多。通过常规删除,析构函数只被调用一次。
最后,您应该将其替换为delete[] p;
答案 3 :(得分:1)
您分配了一个operator new[]
的数组。您必须与operator delete[]
,不 operator delete
平衡:
delete[] p;