指向已释放位置的指针是未定义的行为吗?
int *p = new int;
*p = 10;
delete p;
*p = 10;
cout << *p << endl;
指向已释放位置的指针是未定义的行为吗?
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;
同样,操作系统现在拥有内存,但此时它不太可能对它做任何事情。这就像在您的住宿正式结束后住在酒店房间一样。您可能会也可能不会呆在那里,因为您不知道房间之后是否正在被其他人使用,或者它是否仍然是空的。你可能会被赶出去,或者你可能是安全的。