C ++删除操作符混淆

时间:2010-06-29 20:20:01

标签: c++ delete-operator

  

可能重复:
  ( POD )freeing memory : is delete[] equal to delete ?

char* pChar = new char[10];

delete pChar; // this should not work but it has same effect as 
              // delete[], WHY?
              // I know this is illegal, but why does it work?

5 个答案:

答案 0 :(得分:12)

它可能出现以产生相同的效果,但事实并非如此。如果你的数组类型是一个抽象数据类型(即一个类),那么最后九个元素的析构函数就不会被调用。

答案 1 :(得分:8)

因为你很幸运。这是未定义的行为。未定义行为的一种可能性是,即使确实发生了一些糟糕的事情,也似乎没有任何不好的事情发生。你可能要到晚些时候才发现。

你不能指望对原始类型安全。阅读本文(James Roth在评论中也链接):https://isocpp.org/wiki/faq/freestore-mgmt#delete-array-built-ins

答案 2 :(得分:5)

工作。它只是出现才能工作。展示未定义行为的代码可能在第一眼看上去“正常工作”,就像一个带有错误的程序似乎在一个选择不当的测试套件上“工作正常”。

答案 3 :(得分:1)

这是未定义的行为。而且由于“它这次工作”属于“未定义”类别,它可以在某些平台上运行,在某些编译器上。不过,不应该这样做。您是否尝试使用类似析构函数释放对象数组,并查看析构函数是否被调用?

编辑:根据你的意见,你做了......

答案 4 :(得分:0)

在大多数Microsoft Visual Studio版本中,这实际上可以正常工作。但是,没有理由这样做,这完全取决于你的平台。

delete []背后的想法是,这是一个特殊情况,其中在编译时不知道大小,分配框架可能希望以不同方式处理(并优化删除情况)。

严格来说,delete pointerToBaseClass在编译时也没有已知的大小,但这是由虚拟表解决的,编译器知道该类在编译时是多态的。

如果你错误地处理了删除[],它可能也会出现更换分配器(调试器,各种类型的边界管理器,etcetc)和用户可能使用的自定义分配器的工具问题。