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

时间:2012-05-19 05:30:09

标签: c++ pointers undefined-behavior

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

http://ideone.com/Qp3uY

int *p = new int;

*p = 10;

delete p;

*p = 10;

cout << *p << endl;

4 个答案:

答案 0 :(得分:6)

仅存在指向解除分配位置的指针本身并不是未定义的行为。尝试取消引用该指针确实会产生未定义的行为。

答案 1 :(得分:4)

取消引用已删除的指针是未定义的操作。不要这样做。

答案 2 :(得分:3)

这是未定义的行为:

  

如果在标准库中赋予释放函数的参数是一个不是空指针值的指针,则释放函数将释放指针引用的存储,使所有指针无效,引用解除分配存储。使用无效指针值(包括将其传递给释放函数)的效果未定义。 - C ++&#39; 03 3.7.3.2

答案 3 :(得分:0)

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

int *p = new int;

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

*p = 10;

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

delete p;

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

*p = 10;

然后重新使用此内存位置再次将其设置为10。在此期间没有发生任何其他事情,这是一个相当简单的程序,因此操作系统还没有对该内存块做任何其他事情,所以在这种情况下设置它没有任何更大的影响。

cout << *p << endl;

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