-6

指向已释放位置的指针是未定义的行为吗?

http://ideone.com/Qp3uY

int *p = new int;

*p = 10;

delete p;

*p = 10;

cout << *p << endl;
4

4 回答 4

6

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

于 2012-05-19T05:37:41.597 回答
4

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

于 2012-05-19T05:31:27.180 回答
3

这是未定义的行为:

如果标准库中的释放函数的参数是一个不是空指针值的指针,则释放函数将释放指针引用的存储空间,使所有指向释放存储空间的任何部分的指针都无效。使用无效指针值(包括将其传递给释放函数)的效果是未定义的。- C++ '03 3.7.3.2

于 2012-05-19T09:38:59.957 回答
0

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

int *p = new int;

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

*p = 10;

您可以根据需要使用此内存,然后您可以通过调用 告诉操作系统您已完成它,delete就像您在下一行中所做的那样。

delete p;

操作系统现在拥有可用的内存,但它可能会也可能不会对这些内存做些什么。如果你分配了一堆其他内存,那么新的内存范围有可能包括这块内存。操作系统可能会将这个内存交给其他东西,也可能不会 - 它不会告诉你,这就是为什么说仍然使用内存中的那个地方是未定义的行为。

*p = 10;

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

cout << *p << endl;

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

于 2012-05-19T06:30:00.987 回答