标签:
1、析构函数形式:
~类名()
{
}
无参数,无返回值,故不能被重载,只能有一个
2、作用:释放类对象占用的资源(不能释放动态分配的资源 如用 new 申请的资源)
当一个变量超出自己的作用域时占用的资源会被释放,同样,动态分配的资源在此时是不被释放的
必须手动的释放,否则会造成内存泄露
如:
string *p ;
{
string *q = new string("hello")
p = q ;
}//在这里当遇到右花括号,会释放他所在块申请的资源,但动态分配的无法释放
cout<<*p<<endl ;
输出结果为:hello
同样析构函数也无法释放对象中动态申请的资源
如
1 class node
2 {
3 public:
4
5 int a,b;
6 node()
7 {
8 *p = "hello" ;
9 a = 0 ;
10 b = 0 ;
11 }
12 ~node()
13 {
14 cout<<"this is destruct\n" ;
15 //delete p ;
16 }
17
18 };
19
20 int main()
21 {
22 string *q ;
23
24 {
25 node a ;
26 q = a.p ;
27 }
28
29 cout<<"q is "<<*q<<endl ;
30
31 }
输出结果:hello
但是如果加上delete,就会出错了。
3、合成析构函数:
无论我们自己是否为类编写析构函数,编译器都会合成一个析构函数,用于释放
资源,而我们的自己的析构函数只是在释放对象是做些想做的操作(书上这么说的
虽然我感觉不是这样,当然可以理解为只有我们自己的析构函数执行操作并释放资源
),所以释放对象的时候先执行我们自己的析构函数,再执行合成的析构函数。
4.析构函数撤销对象的顺序:
无论是类对象之间,还是类对象内部的数据成语,析构函数都是按照声明顺序的逆序
释放资源
*/
标签:
原文地址:http://www.cnblogs.com/acSzz/p/4562928.html