我在 2.5 年前就从汇编转向了 C 和 C++。
我向 C 和 C++ 继承了汇编中隐含的一些东西,但后来我意识到这些东西实际上是未定义的行为。
其中之一是delete ptr
和之间的区别delete[] array
,对于操作系统来说通常是一次调用,因为没有析构函数。
我最新的假设是以下代码:
std::byte *a = new std::byte[10];
short *b = reinterpret_cast<short*>(a);
delete[] b;
这是未定义的行为吗?根本没有析构函数。
是的,这是未定义的行为。赋予表达式的类型
delete[]
必须与其引用的对象的实际类型相似。“相似”本质上意味着它只能在
const
资格上有所不同。同样,用 做几乎任何其他事情
b
(除了将其强制转换回std::byte*
)都会产生未定义的行为。这种类型reinterpret_cast
通常会以未定义的行为结束。只有少数非常具体的用例是明确定义的。在 C++ 中,与汇编相反,有一个对象模型,您需要考虑这些对象,这些对象保存特定于其类型的值,而不是保存非类型化位的内存位置,这些位可以解释为任何操作的任何类型。