删除字符数组.替代方式

Delete char array. Alternative way?

本文关键字:方式 数组 字符 删除      更新时间:2023-10-16

可能重复:
对于char数组,是否需要调用delete[]vs delete?

char *p = new char[200];
delete p;

这种(我更改了var名称(代码来自一个大型商业项目。

第三行。这是对的吗?我该换还是留在那里。Coz没有这个和这个程序运行超过4年的错误报告。

谢谢。

必须使用delete[],因为您使用了new[],这不是一个替代方案。

delete [] p;
  • 如果new使用[],也必须删除:

    T *p = new T[100];
    delete [] p; //correct
    delete p   ; //incorrect
    
  • 如果new不使用[],delete也不能使用它:

    T *p = new T;
    delete [] p; //incorrect
    delete p   ; //correct
    

不正确并不意味着你会得到编译错误;这也不意味着程序必须在运行时失败。这意味着,程序行为是未定义的;任何事情都有可能发生,而且很可能会发生内存泄漏。

理论上,要遵循标准,第3行应为delete[] p;

但是,在实践中,这没有任何含义,因为char的析构函数什么都不做。

事实上,delete和数组delete之间的区别在于,使用数组delete,析构函数的调用次数与对象的调用次数一样多。对于常规删除,析构函数只调用一次。

最后,您应该将其替换为delete[] p;

您分配了一个带有operator new[]的数组。你必须用operator delete[]来平衡,而不是operator delete:

delete[] p;