我有这段代码:
#include <iostream>
using namespace std;
void main(){
int *ptr = new int(15);
cout << "Address of ptr: " << ptr << endl;
cout << "Content of ptr: " << *ptr << endl << endl;
delete ptr;
*ptr = 30;
cout << "Address of ptr: " << ptr << endl;
cout << "Content of ptr: " << *ptr << endl;
}
这是输出:
Address of ptr: 007B81F0
Content of ptr: 15
Address of ptr: 007B81F0
Content of ptr: 30
为什么这样做?为什么我仍然可以使用指针?发生了什么事?
这在某些方面有用吗?
答案 0 :(得分:11)
这是典型的未定义行为,它恰好起作用,因为先前为*ptr
分配的内存尚未被操作系统*回收。你永远不应该依赖这种代码。
请注意,指针的地址保持不变,因为C ++运行时不会使指针无效(这需要时间,在C ++中你不需要为不需要的东西付费)。
*另见Remy Lebeau的评论如下。
答案 1 :(得分:0)
正如vsoftco解释的那样,操作系统尚未回收内存。现在,如果我们执行类似下面的操作,您可能会遇到完全不同的输出:
int *ptr = new int(15);
cout << "Address of ptr: " << ptr << endl;
cout << "Content of ptr: " << *ptr << endl << endl;
delete ptr;
int *ptr2 = new int(15); // making a new ptr to use memory.
*ptr = 30; // <- OPS!
delete ptr2; // deleting new ptr.
cout << "Address of ptr: " << ptr << endl;
cout << "Content of ptr: " << *ptr << endl;
无论如何,结果是未定义的行为
答案 2 :(得分:-3)
虽然使用了删除关键字但由于某种原因没有发生指针的解除分配。(可能指针的范围仍在使用中)
使用指针是C ++的一个重要方面。使用指针处理引用级别或内存地址非常重要。