网站产品标签文章标签怎么做,卖主机 服务器的网站,关于学校网站建设的请示,深圳外企公司排名目录 一、概念 1. 析构函数是什么#xff1f; 2. 为什么要有析构函数#xff1f; 3. 怎么用析构函数#xff1f; 3.1 创建析构函数 3.2 调用析构函数 二、特性 三、由编译器生成的默认析构函数 四、对象的析构顺序 1. 局部对象 2. new出来的堆对象 3. 全局对象 一、概念
1…目录 一、概念 1. 析构函数是什么 2. 为什么要有析构函数 3. 怎么用析构函数 3.1 创建析构函数 3.2 调用析构函数 二、特性 三、由编译器生成的默认析构函数 四、对象的析构顺序 1. 局部对象 2. new出来的堆对象 3. 全局对象 一、概念
1. 析构函数是什么 析构函数是一个特殊的成员函数用来释放对象使用的资源(如关闭文件、释放内存等)。 2. 为什么要有析构函数 如何释放对象申请的系统资源忘记释放怎么办能不能在销毁对象时自动释放 举个小例子
class Test
{
public://构造函数Test(){_arr (char*)malloc(1024*1024*1024);//申请1G空间}//销毁函数用于释放资源void Destory(){free(_arr);}
private:char* _arr;
};int main()
{Test* t new Test;//在堆上创建一个对象delete t;//销毁一个对象while (1) {}return 0;
}如果要销毁Test对象必须先使用Destory公有方法来释放资源否则会造成内存泄漏
这未免有点麻烦而且容易忘记那能否在对象销毁的同时释放资源呢 将以上程序运行起来对比前后的内存变化可以发现销毁对象前如果忘记释放资源就会造成内存泄漏等问题。 程序运行前 程序运行后 所以为避免C使用者在销毁对象时忘记释放对象使用的资源的问题C引入了析构函数在析构函数里写释放资源的代码在对象销毁时编译器会自动调用析构函数释放对象使用的资源。 析构函数相对于自己写的销毁函数其优势在于不需要自己去显示调用。 3. 怎么用析构函数 3.1 创建析构函数 创建时要注意析构函数特征析构函数名是在类名前加上字符~、无参数无返回值。 类中动态申请的资源需要在析构函数中写相应的代码手动释放。 用以下例子来说明如何创建无参构造函数和带参构造函数
创建时要注意析构函数特征析构函数名是在类名前加上字符~、无参数无返回值。
class Test
{
public://构造函数Test(){_arr (char*)malloc(1024*1024*1024);//申请1G空间}//析构函数在析构函数里释放资源对象被销毁时会自动被调用。~Test(){cout 析构函数调用成功 endl;free(_arr);}
private:char* _arr;
}; 3.2 调用析构函数 在对象销毁时编译器会自动调用析构函数。所以析构函数是不需要我们去显示调用的我们只需要记得销毁对象(特指堆上的对象)即可。 接上面的例子演示如何调用无参构造函数和带参构造函数
int main()
{//在堆上创建对象tTest* t new Test;for (int i 0; i 100000; i){cout i endl;}//销毁对象tdelete t;return 0;
} 二、特性 再次强调析构函数的任务不是销毁对象而是完成对象中资源的清理工作对象在销毁时会自动调用析构函数。对象的内置类型的成员变量由系统进行回收自定义类型的成员变量系统会去调用它的析构函数。 析构函数是特殊的成员函数其特征如下 1. 析构函数名是在类名前加上字符~。 2. 无参数无返回值类型。 3. 对象动态申请的资源需要在析构函数中写相应的代码手动释放。 4. 一个类只能有一个析构函数析构函数不能重载。 5. 若未显式定义系统会自动生成默认的析构函数。 6. 对象生命周期结束时C编译系统系统自动调用析构函数。 三、由编译器生成的默认析构函数 若未显式定义系统会自动生成默认的析构函数。 那什么时候需要显示的写析构函数什么时候让编译器自动生成呢 有资源申请(如使用malloc动态开辟空间)时一定要写否则会造成资源泄漏。如果类中没有申请资源时析构函数可以不写直接使用编译器生成的默认析构函数。 四、对象的析构顺序
1. 局部对象 后实例化的对象先析构先实例化的对象后析构。因为对象是定义在栈帧里面的而栈帧的建立遵循后进先出。 class A
{
public:~A(){cout A被析构 endl;}
};class B
{
public:~B(){cout B被析构 endl;}
};class C
{
public:~C(){cout C被析构 endl;}
};int main()
{A a;B b;C c;return 0;
} 2. new出来的堆对象 堆对象的析构发生在使用delete的时候与delete的使用顺序相关。 int main()
{A* a new A();B* b new B();C* c new C();delete a;delete b;delete c;return 0;
} 3. 全局对象 在一个源文件中的全局对象先实例化的对象后析构。 A a;
B b;
C c;int main()
{return 0;
} ------------------------END-------------------------
才疏学浅谬误难免欢迎各位批评指正。