在C++中,是否定义了通过char*删除原始类型(如uint32_t)的行为?

Nic*_*vac 2 c++ primitive-types language-lawyer delete-operator

以下是否定义了行为?

uint32_t* p = new uint32_t();

char* p2 = reinterpret_cast<char*>(p);

delete p2;
Run Code Online (Sandbox Code Playgroud)

(是否有与之相关的标准报价?)

我知道存在其他选择,但我只是对这一个感到好奇.

谢谢!

Nic*_*las 6

来自C++ 17标准中的[expr.delete]/3(虽然这个规则可以追溯到C++ 11,可能更早,但我没有那个规范):

如果要删除的对象的静态类型与其动态类型不同,则静态类型应为要删除的对象的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义.

指向的对象的动态类型是uint32_t.指针的类型是char.这些不一样,也不是char基类uint32_t,所以行为是不确定的.