指向已解除分配位置的指针 是未定义的行为吗?
Pointer to deallocated location Is it a Undefined Behavior?
>指向已解除分配位置的指针 这是未定义的行为吗?
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;
同样,操作系统现在拥有内存,但此时它不太可能对它做任何事情;这就像在你正式结束住宿后住在酒店房间一样。您可能无法留在那里,因为您不知道该房间之后是否被其他人使用,或者它是否仍然空着。你可能会被赶出去,或者你可以安全。
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 在硬件SIMD矢量指针和相应类型之间进行"interpret_cast"是一种未定义的行为吗
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- C++:私有类指针成员返回未定义的值
- 返回对未定义指针的引用
- 使用无效指针初始化指针声明符的行为是否未定义?
- 根据下面的作者,如果两个指针指向不同的数组,则比较的第一个版本将未定义
- 强制转换为指针引用是否会导致未定义的行为
- C++编译并链接到指向未定义函数的指针
- C++数组上的指针数学中的未定义行为
- 通过在此指针上放置新位置重新初始化对象时未定义的行为
- C 指针未定义的参考
- 将未定义的参数计数作为模板参数的函数指针
- 指针上的const_cast "this"是未定义的行为吗?
- 为什么指针减法是C++中未定义的行为?
- 未定义的引用指针的变量模板在clang中功能,而不是GCC
- 为什么将指针指向std ::设置的提取节点是未定义的行为
- 使用已删除shared_ptr中的原始指针的未定义行为
- C++修改指向结构的指针向量会导致未定义的行为
- 未定义的引用:试图初始化来自不同类的对象的指针数组