c++带有指针成员的类处理方式详解

  

在一个类中,如果类没有指针成员,一切方便,因为默认合成的析构函数会自动处理所有的内存。但是如果一个类带了指针成员,那么需要我们自己来写一个析构函数来管理内存。在& lt; & lt; c++ primer>比;中写到,如果一个类需要我们自己写析构函数,那么这个类,也会需要我们自己写拷贝构造函数和拷贝赋值函数。

  

析构函数:

  

我们这里定义一个类HasPtr,这个类中包含一个int类型的指针。然后定义一个析构函数,这个函数打印一句话。

  

HasPtr。h类的头文件

        # pragma>   # include“stdafx.h”      # include & lt; iostream>   # include“HasPtr.h”      使用名称空间性病;      HasPtr:: HasPtr (int, int * p)   {   val=我;   ptr=p;   }      int HasPtr: get_ptr_value ()   {   返回* ptr;   }      空白HasPtr: set_ptr_value (int * p)   {   ptr=p;   }      int HasPtr: get_val ()   {   返回val;   }      空白HasPtr: set_val (int v)   {   val=v;   }      HasPtr:: ~ HasPtr ()   {   cout & lt; & lt;“HasPtr析构函数”& lt; & lt;endl;   }      之前      

ClassWithPointer类,包含主要入口,HasPtr在堆栈上。

     //ClassWithPointer。cpp:定义控制台应用程序的入口点。//# include“stdafx.h”   # include & lt; iostream>   # include“HasPtr.h”   使用名称空间性病;      int main ()   {   int temp=100;   HasPtr ptr(2,临时);   cout & lt; & lt;ptr.get_ptr_value () & lt; & lt;endl;   cout & lt; & lt;ptr.get_val () & lt; & lt;endl;   系统(“暂停”);   系统(“暂停”);   返回0;   }   之前      

执行该入口方法,发现最后还是打印了析构函数这句话,好吧,在主方法中,堆栈上定义了一个HasPtr,在主方法退出前,析构函数自动调用了。

  

如果将HasPtr改为动态对象,也就是放在堆上呢?

  

ClassWithPointer类,包含主要入口,HasPtr在堆上。

     //ClassWithPointer。cpp:定义控制台应用程序的入口点。//# include“stdafx.h”   # include & lt; iostream>   # include“HasPtr.h”   使用名称空间性病;      int main ()   {   int temp=100;//HasPtr ptr(2,临时);   新HasPtr HasPtr * ptr=(2,临时);   cout & lt; & lt;ptr→get_ptr_value () & lt; & lt;endl;   cout & lt; & lt;ptr→get_val () & lt; & lt;endl;   系统(“暂停”);   返回0;   }      之前      

执行一下,发现析构函数没有调用对吧,我们在返回0前面添加一个删除ptr;析构函数执行了。

  

所以,这里有两个结论:

  
      <李>当一个对象在堆栈上时,析构函数自动调用。   <李>当一个对象在堆上时,需要调用删除语句,析构函数才会被执行。
      李   
  

现在在析构函数中调用删除语句来删除指针成员。

  

头文件不变,HasPtr。cpp文件代码如下:

        # include“stdafx.h”      # include & lt; iostream>   # include“HasPtr.h”      使用名称空间性病;      HasPtr:: HasPtr (int, int * p)   {   val=我;   ptr=p;   }      int HasPtr: get_ptr_value ()   {   返回* ptr;   }      空白HasPtr: set_ptr_value (int * p)   {   ptr=p;   }      int HasPtr: get_val ()   {   返回val;   }      空白HasPtr: set_val (int v)   {   val=v;   }      HasPtr:: ~ HasPtr ()   {   cout & lt; & lt;“HasPtr析构函数”& lt; & lt;endl;   删除ptr;   }      之前      

, ClassWithPointer代码如下:

     //ClassWithPointer。cpp:定义控制台应用程序的入口点。//# include“stdafx.h”   # include & lt; iostream>   # include“HasPtr.h”   使用名称空间性病;      int main ()   {   int temp=100;   HasPtr ptr(2,临时);   cout & lt; & lt;ptr.get_ptr_value () & lt; & lt;endl;   cout & lt; & lt;ptr.get_val () & lt; & lt;endl;   系统(“暂停”);   返回0;   }      之前      

执行一下,正常打印结束后,抛出错误:

  

 C + +带有指针成员的类处理方式详解

  

这里说明删除不能删除堆栈上的指针值。

c++带有指针成员的类处理方式详解