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释放的必须是堆中的对象。

理解如果有什么不对的地方,请大家指针,谢谢。

猜你喜欢

转载自www.cnblogs.com/zpchya/p/10660512.html
今日推荐