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