指向已解除分配位置的指针 是未定义的行为吗?

Pointer to deallocated location Is it a Undefined Behavior?

本文关键字:未定义 指针 解除分配 位置      更新时间:2023-10-16

>指向已解除分配位置的指针 这是未定义的行为吗?

http://ideone.com/Qp3uY

int *p = new int;
*p = 10;
delete p;
*p = 10;
cout << *p << endl;

仅仅存在指向已释放位置的指针本身并不是未定义的行为。但是,尝试取消引用该指针确实会产生未定义的行为。

取消引用已删除的指针是一项未定义的操作。 别这样。

这是

未定义的行为:

如果标准库中为释放函数提供的参数是不是空指针值的指针,则释放函数应释放指针引用的存储,从而使引用已释放存储的任何部分的所有指针无效。使用无效指针值(包括将其传递给释放函数(的效果尚未定义。- C++ '03 3.7.3.2

当您分配内存以创建新指针时,就像在第一行中所做的那样

int *p = new int;

要求操作系统生成一些内存供您使用,只要您愿意。然后你可以把一些东西放在那个地方,就像你做的那样

*p = 10;

只要您愿意,您就可以使用此内存,然后您可以通过调用 delete 来告诉操作系统您已经完成了它,就像您在下一行所做的那样。

delete p;

操作系统现在具有可用的内存,但它可能会也可能不会对该内存执行某些操作。如果分配一堆其他内存,则新的内存范围可能包含此内存。操作系统可能会将此内存交给其他东西,或者可能不会 - 它不会告诉您,这就是为什么仍然在内存中使用该位置被称为未定义的行为

*p = 10;

然后,重复使用此内存位置以再次将其设置为 10。在此期间没有发生任何其他事情,这是一个相当微不足道的程序,因此操作系统尚未对该内存块执行任何其他操作,因此在这种情况下设置它不会产生更大的效果。

cout << *p << endl;

同样,操作系统现在拥有内存,但此时它不太可能对它做任何事情;这就像在你正式结束住宿后住在酒店房间一样。您可能无法留在那里,因为您不知道该房间之后是否被其他人使用,或者它是否仍然空着。你可能会被赶出去,或者你可以安全。