C++标准非常明确地指出,使用
因此,当编译器遇到使用
但是,在删除操作的每个步骤中,只有一种明智的处理方式:
全局删除运算符
delete
或delete[]
删除void
指针是未定义的行为,正如this answer所引用的那样:
然而,据我了解,这意味着不能使用
void*
类型的指针来删除对象,因为没有void
类型的对象。
delete
和delete[]
只做两件事:
- 调用适当的析构函数
- 调用适当的
operator delete
函数,通常是全局的
operator delete
(以及operator delete[]
),该单参数为void* ptr
。因此,当编译器遇到使用
void*
操作数的删除表达式时,它当然可以恶意地执行一些完全不相关的操作,或者仅输出该表达式的代码。更好的做法是,它可以发出诊断消息并拒绝编译,尽管我测试过的MSVS、Clang和GCC版本都没有这样做。(后两个版本使用-Wall
发出警告;使用/W3
的MSVS则不会。)但是,在删除操作的每个步骤中,只有一种明智的处理方式:
void*
不指定析构函数,因此不会调用任何析构函数。void
不是类型,因此不能具有特定对应的operator delete
,因此必须调用全局的operator delete
(或[]
版本)。由于函数的参数是void*
,因此不需要进行类型转换,并且运算符函数必须正确运行。
long[64]
),使用delete
这种方式是否安全?全局删除运算符
void operator delete(void* ptr)
(以及相应的数组版本)能否直接安全地用于void*
数据(再次假设不需要调用析构函数)?