编程快速入门(c++)——析构函数技巧
Posted 豪杰仿真科技
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程快速入门(c++)——析构函数技巧相关的知识,希望对你有一定的参考价值。
一、概述
c++析构函数会在类对象的生命周期结束时执行。比如在main函数中定义的pig对象佩奇,在return后,生命周期结束,调用析构函数。
using namespace std;
class pig
{
public:
int weight;
pig(int w) : weight(w){};
~pig() { cout << "pig对象生命结束"; };
};
int main()
{
pig Page(20);
return 0;
}
析构这一机制,使得类的用途变得十分灵活。经典的用法就是,在析构函数中释放具有堆区内存的类属性。比如:智能指针。
二、动态内存潜在问题
在c语言中,对于动态内存分配,往往需要进行malloc和free的搭配,而有时,我们可能会遗漏free,从而造成内存泄漏,此外free次数大于malloc时,程序会崩溃。在c++中,malloc和free被new和delete所替代。
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;
}
三、析构函数实现动态数组
从上一节可以基本归纳,我们要做的就是用delete释放new出来的变量。
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被释放。
四 析构函数与堆区对象的释放
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++)——析构函数技巧的主要内容,如果未能解决你的问题,请参考以下文章