在一个类中,如果类没有指针成员,一切方便,因为默认合成的析构函数会自动处理所有的内存。但是如果一个类带了指针成员,那么需要我们自己来写一个析构函数来管理内存。在& 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++带有指针成员的类处理方式详解