如果一个变量在它之前释放了另一个(相同的数据类型)变量,如何将其分配给内存?



我在互联网上看到了这段悬空指针下的 c++ 代码,并尝试执行它。 这可能看起来不愉快,但这里是...

int *x, *y, *z;
x = new int;
*x = 3;
y = x;
delete x;
x = NULL;
z = new int;
*z = 5;
*y = 2;

当我打印 *z 时,它总是等于 *y(如最后一行代码中指定(的值,在这种情况下为 2,但是如果我在倒数第二行本身专门执行 *z = 5,这怎么可能。

有了未定义的行为,一切皆有可能。

在您的情况下,y指向的对象被销毁(它是一个悬空的指针(,并且使用 *y 取消引用y是 UB(当您尝试在那里分配某些内容时更糟(。

似乎在delete x之后,编译器决定在new调用中将内存块分配给z,这是完全合理的(但不能保证 - 绝对任何其他空闲内存块也是有效的(。
由于y恰好指向相同的内存块,因此看起来您可以使用y操作z pointee 对象,但您不能 - 您不知道y真正指向的位置。

最新更新