delete *p和delete [] p相比有什么不同?

17

以下代码来自Microsoft文档

int (**p) () = new (int (*[7]) ());
delete *p;

我认为这里应该使用delete [] p

delete *pdelete [] p一样吗?


5
delete *pdelete [] p 不同。 - Jarod42
你说得对。它们不一样。 - Cruz Jean
1
typedef会让事情更清晰。 - Jarod42
无论如何,p[0]没有被初始化。他们打错了。 - Jarod42
删除已经使用new[]创建的内容,并释放已经使用new创建的数据。虽然在现代代码中,应该避免大多数对new的使用,因为它不再是动态创建对象的首选方式。相反,可以尝试使用std::make_uniquestd::make_shared,或者使用标准容器来代替。 - François Andrieux
1个回答

17

那段代码是无效的C++,因为只有指向对象的指针才能被删除。 *p 的类型是 int (*)(),它是函数指针,而不是指向对象的指针。

即使在允许模式下,MSVC本身也不能编译它:

error C2541: 'delete': cannot delete objects that are not pointers

他们应该使用delete []


在什么情况下需要动态分配函数指针? - Ayxan Haqverdili
@Ayxan 那将是另一个问题,但例如您可能希望有一个要执行的任意操作列表。 - Acorn
@Ayxan 我已经快速在这里发布了它:https://stackoverflow.com/q/55524710/9305398 - Acorn
1
尽管这是特定于MSVC的,但是在尝试编译时,g++会产生以下类似的错误:error: cannot delete expression of type 'int (*)()'。 ..看起来微软在他们的文档中错过了这么简单的东西 :/ - txtechhelp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接