编程快速入门(c++)——析构函数技巧

Posted 豪杰仿真科技

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程快速入门(c++)——析构函数技巧相关的知识,希望对你有一定的参考价值。

一、概述

    c++析构函数会在类对象的生命周期结束时执行。比如在main函数中定义的pig对象佩奇,在return后,生命周期结束,调用析构函数。

#include <iostream>using namespace std;class pig{public: int weight; pig(int w) : weight(w){}; ~pig() { cout << "pig对象生命结束"; };};int main(){ pig Page(20); return 0;}

编程快速入门(c++)(八)——析构函数技巧

    析构这一机制,使得类的用途变得十分灵活。经典的用法就是,在析构函数中释放具有堆区内存的类属性。比如:智能指针。


二、动态内存潜在问题

    在c语言中,对于动态内存分配,往往需要进行malloc和free的搭配,而有时,我们可能会遗漏free,从而造成内存泄漏,此外free次数大于malloc时,程序会崩溃。在c++中,malloc和free被new和delete所替代。

#include <iostream>using namespace std;int main(){ int index[3] = {0, 1, 2}; int *p = new int(10); //申请的内存,赋值为10    int *f = new int[3]; //堆区申请长度为3个int的内存 for (int i : index) //i遍历index中的所有元素 { f[i] = i * i; } cout << *p << endl; cout << *f << " " << *(f + 1) << " " << *(f + 2) << endl; delete p; //释放堆区整型p delete[] f; //释放堆区整型数组f; return 0;}

编程快速入门(c++)(八)——析构函数技巧


三、析构函数实现动态数组

    从上一节可以基本归纳,我们要做的就是用delete释放new出来的变量。

#include <iostream>using namespace std;class vec{public:    int *ptr;  int len; vec(int size) { len = size; ptr = new int[size]; for (int i = 0; i < size; i++) { ptr[i] = i * i; } } ~vec() { if (ptr != NULL) { delete ptr; ptr = NULL; } } int at(int i) const{ return ptr[i]; } void show(){ for (int i = 0; i < len; i++) { cout << ptr[i] << " "; } }};int main(){ vec vec1(3); cout << vec1.at(1) << endl; vec1.show(); return 0;}

    上述的vec类,具有成员指针ptr。构造函数让ptr指向了堆区内存,并为该内存区域赋值;析构函数~vec起到了让释放ptr所指向的堆区内存的功能。即该类对象生成时,具有动态内存,return 0以后,调用析构函数,堆区ptr被释放。


四 析构函数与堆区对象的释放

#include <iostream>using namespace std;class pig{public: int weight; pig() : weight(0){}; pig(int w) : weight(w){}; ~pig() { cout << "pig over"; };};class int_ptr //智能指针类,栈区变量{public: pig *Page; //智能指针成员指针,用于指向堆区地址 int_ptr(pig *George) { Page = George; };    ~int_ptr() //析构时,释放Page { if (Page != nullptr) { delete Page; Page = nullptr; } };};

int main(){ int_ptr pig_ptr(new pig(3)); cout << pig_ptr.Page->weight << endl; return 0;}

    return 0 后,pig_ptr的析构函数执行,释放pig(3)所分配内存。

    总结一句话就是,用栈区的类的析构函数去释放堆区内存。


以上是关于编程快速入门(c++)——析构函数技巧的主要内容,如果未能解决你的问题,请参考以下文章

C++入门(拷贝)构造函数和析构函数

C++入门(拷贝)构造函数和析构函数

C++入门派生类和基类的构造/析构函数关系

编程快速入门(c++)——初识类

C++编程经验(13):当析构函数遇上多线程

C++ 【错误求帮改】构造函数、析构函数,delete等编程时的问题