C++ 指向解除分配位置的指针是否为未定义行为?

C++ 指向解除分配位置的指针是否为未定义行为?,c++,pointers,undefined-behavior,C++,Pointers,Undefined Behavior,指向解除分配位置的指针是否为未定义行为 int*p=新的int; *p=10; 删除p; *p=10; cout取消对已删除指针的引用是一个未定义的操作。不要这样做。仅仅存在指向解除分配位置的指针本身并不是未定义的行为。但是,尝试取消引用该指针确实会产生未定义的行为。当您分配内存以生成新指针时,就像在第一行中所做的那样 int *p = new int; 您要求操作系统生成一些内存供您使用,只要您愿意。然后你可以在那个地方放点东西,就像你当时做的那样 *p = 10; 此内存可供您任意使用

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

int*p=新的int;
*p=10;
删除p;
*p=10;

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

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

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

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

*p = 10;
此内存可供您任意使用,然后您可以通过调用
delete
,告诉操作系统您已使用完它,就像您在下一行中所做的那样

delete p;
操作系统现在有可用的内存,但它可能会也可能不会使用该内存执行某些操作。如果分配一组其他内存,则新内存范围可能包括此内存。操作系统可能会将这个内存分配给其他的东西,也可能不会——它不会告诉你,这就是为什么说仍然使用内存中的那个位置是未定义的行为

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

cout << *p << endl;

cout这是未定义的行为:

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


对下一个问题?当我在字典中查找单词
未定义时,我没有看到“Crash”的任何含义……为什么这不是一个真正的问题!我真的不知道是不是UB。。。我们的讲座告诉我们它不是UB…可能再也没有位置了-操作系统可以从您的虚拟内存空间中删除该地址。
cout << *p << endl;