delete *p可以替代delete[] p吗?
在stackoverflow看到一个标题描述的问题,问题链接是:https://stackoverflow.com/questions/55524140/is-delete-p-an-alternative-to-delete-p/55524252#55524252。下面一起来看看它。
有一段来自微软官方文档的代码:
1 int (**p)() = new (int (*[7])()); 2 delete *p;
问题的发起者认为应该用delete[] p来替换这里的delete *p。
下面有一些回答:
1、p[0]是没有被初始化的,会导致编译错误。
2、应该用delete[]来释放new[]创建的对象;用delete来释放new创建的对象。
3、这个描述是错误的因为只有指针指向的对象才可以被释放。*p的类型是int (*)(),它是一个指向函数的指针,不是指向对象的指针。
我们用Visual Studio 2017和g++都测试一下,
Visual Studio 2017中:
g++中:
总结:
1、用delete释放new创建的对象,用delete[]释放new[]创建的对象;
2、delete释放的必须是堆中的对象。
理解如果有什么不对的地方,请大家指针,谢谢。