c++ 的 指针析构 问题

析构函数主要用于释放通过new分配的内存,防止内存泄漏。在析构函数中,不需要将指针设为NULL,因为析构后指针变量本身会被回收。然而,为了防止误操作,尤其是在大型项目中,将指针设为NULL可以提高代码安全性。调用delete删除动态分配的对象时,只有当指针非NULL时才会调用析构函数。如果多次delete一个已删除的对象,可能导致未定义行为。
摘要由CSDN通过智能技术生成

c++析构函数里面要不要把指针都指向NULL

不需要,

(1)析构时类中所有成员都被回收了包括指针变量,所以不管它指向哪里都没有意义了。

析构函数的主要作用:释放指针指向的内存,防止内存泄漏

指针本身没有析构的概念,直接赋值NULL就可以了,如果指针指向的是普通变量,函数退出后会自动释放包括指针本身

实际上指针不赋值null也没问题,只要你确保同一命名空间下其他代码不再去访问它即可,

置null的意义在于在代码量大的情况下,防止误操作降低出错率。

------

但是如果指针指向的是由new申请的对象、数组,则需要主动用delete释放因为动态分配的内存,编译器是无法预知的,从而无法自动释放这样会产生内存泄漏。

这个析构函数 它释放的是类的成员变量 抛开别的不说

(2)释放的是 你new出来的那个对象的指针.,..

所以其实

(3)没有释放这个new出来的对象 ,.,

所以你需要调用 delete 在析构函数里 手动释放...

------

第二个问题 程序结束了 你的new出来的堆里的内存一定会被释放 这是操作系统保证的 不是你的程序的事了 ...

参考:

https://zhidao.baidu.com/question/182406872591878044.html

https://zhidao.baidu.com/question/944741638727340652.html

C++ 析构函数的坑

https://zhuanlan.zhihu.com/p/400044925

============================

指针的值为NULL时,执行delete,系统不会调用析构函数,否则调用析构函数

https://blog.csdn.net/amyliyouhua/article/details/6194761

#include <iostream>
usingnamespace std;

class A
{
public: 
       A( void )
       {
               cout << "A::A( )默认构造函数" << endl;
       }
       
       ~A( void )
       {
           cout << "~A::A( )析构函数" << endl;
       }
};

int main( void )
{
    A* p = new A; //创建一个对象,系统自动调用默认构造函数 
    delete p; //只要指针的值不为NULL,调用delete操作符,系统自动调用析构函数
    delete p; //只要指针的值不为NULL,调用delete操作符,系统自动调用析构函数
    delete p; //只要指针的值不为NULL,调用delete操作符,系统自动调用析构函数
    p = NULL;
    
    cout << endl << endl;
    A* pp = new A;
    delete pp; //只要指针的值不为NULL,调用delete操作符,系统自动调用析构函数
    pp = NULL;
    delete pp; //指针pp已经是NULL,调用delete操作符系统不会再调用析构函数了 
    delete pp; //指针pp已经是NULL,调用delete操作符系统不会再调用析构函数了 
    
  system( "PAUSE" );
  return EXIT_SUCCESS;
}

/*=========================

A::A( )默认构造函数

~A::A( )析构函数

~A::A( )析构函数

~A::A( )析构函数

A::A( )默认构造函数

~A::A( )析构函数

请按任意键继续. . .

===========================*/

class A; 
A *a = new A; 
如果delete a; 
a不会为空,而会为0xcccc这类型的吧 
所以当你下次用得时候 
if( a ) a->func( ); 
就会成功,非空的检查就没有用, 
所以你最好在delete a;后面加上a = NULL
-------------

delete a;//删除 对象指针变量a 所指向的对象,即释放对象所占用的 堆内存。但指针变量本身并没有被删除??
a = NULL;//将指针变量设置为 NULL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值