先看代码:
#include<iostream>
using namespace std;
int* func()
{
// 利用new关键字可以将数据开辟到 堆 区
// 在堆区创建整型数据
// new返回的是 该数据类型的指针
int *a = new int(10); // 指针a本质也是局部变量,放在栈上,指针保存的 数据 是放在了堆区
// 指针指向的也是堆区中数据所在的地址
return a;
}
int main() {
// 在堆区开辟数据
int *p = func();
cout << *p << endl;
cout << "-------------我是一个分割线-----------------"<<endl;
//利用delete释放堆区数据
delete p;
cout << *p << endl;//会输出一个随机的地址,而且代码中其他被delete的指针的解指针都相同
cout << p << endl;
cout << "-------------我是一个分割线-----------------"<<endl;
int *b = new int(20);
delete b;
cout << *b << endl;
cout << b << endl;
cout << "-------------我是一个分割线-----------------"<<endl;
int *c = new int(30);
delete c;
c = nullptr;
cout << c << endl; //输出0,空指针不指向任何对象
return 0;
}
输出:
10
-------------我是一个分割线-----------------
425848149
0x61961ed55eb0
-------------我是一个分割线-----------------
425848149
0x61961ed55eb0
-------------我是一个分割线-----------------
0
总结:
1、利用delete可以释放堆区的数据,但是并不会让这个指针消失,而是会统一的都指向某个地址,这个地址所对应的值也是一个 不确定 的值。
比如:
425848149
0x61961ed55eb0
在此次运行中,所有的delete掉的指针都指向0x61961ed55eb0这个地址,解指针都为425848149
通过我尝试发现,再重新预处理、编译、汇编、链接后,上面两个值会变化(我目前还不知道什么原因,还在学习中。。。)。
2、delete掉的指针初始化为nullptr(C++11新标准下避免使用NULL),此时输出c会是0(也就是它的地址),而不能输出*c,因为空指针不指向所有对象。
有没有大佬可以解释下为何delete掉指针会指向一个随机的地址啊?
补充知识:
malloc -free 与new-delete 区别和联系
1、区别
malloc 不会调用构造函数, new会调用构造函数;
free 不会调用析构函数,delete会自动调用析构函数,完成内存释放的善后工作;
new 和delete是运算符,不是函数,因此执行效率更高,malloc和free是函数;
2、联系(混合使用)
malloc 建立,delete 释放: 对类的内存申请没有调用构造函数;
new 建立,free释放: 只有构造,没有析构。
知识来源