C++指针释放问题

转载自:https://blog.csdn.net/wang13342322203/article/details/81868074  侵删

今天看到了一个问题,其实在项目中也经常遇到指针释放的问题,先看看一个简单的指针释放的问题:

**************************************

 
  1. 问题如下:

  2. (1)一般在c++类中有成员指针的话,会在类的析构函数里释放(delete)这个指针?

  3. (2)基于(1),如果传给这个成员指针不是一个堆分配的指针,那类发生析构会发生错误,这个怎么解决??

  4. 如下:

  5. class A

  6. {

  7. public:

  8. int *p;

  9. ~A()

  10. {

  11. delete p;

  12. }

  13. }

  14. /----------------------------------

  15. {

  16. A a;

  17. int b = 0;

  18. a.p = &b;

  19. }

  20. /----------------------------------


**************************************

评论如下:

1、析构函数里只会delete在类的构造函数或初始化函数中new的指针;

2、不是new就别在析构中delete了, 另外delete之前 if (p != NULL),delete之后 p = NULL;

3、b是栈上变量,自动释放,不能delete,delete要和new配对使用;

4、对这种情况,有个基本的原则:谁new,谁delete;
也有一种特殊的带引用计数器的指针对象,但是也并非是别人delete,
而是在不使用的时候发出一个减少引用计数的调用,当计数器降为0的时候,由这个对象自己delete。

5、************************************** 很给力的评论
1. 一般的原则是,如果没有在构造函数中new,就不要在析构函数中delete。
2. 在楼主的代码中,由于没有在构造函数中new,所以也就不需要在析构函数中delete。
3. 但楼主说,代码如果是这样写的:

C/C++ code?

1

2

3

  A a;

  int* b = new int(0);

  a.p = b;


那是否可以在A的析构函数中写delete呢?理论上说也是可以的,但是最好不要这样做,在类外面new的,那么也就请在类的外面delete,也就是说,上面代码应该写成:

C/C++ code?

1

2

3

4

5

  A a;

  int* b = new int(0);

  a.p = b;

  // ... 使用b

  delete b;



4. 因此,new和delete的对称性包含两方面的含义:
a. new和delete要成对出现。
b. 出现的位置,应当处于同一个层面。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值