C++中指针delete的学习心得

先看代码:

#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释放: 只有构造,没有析构。
知识来源

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值