析构函数与动态内存分配

析构函数与动态内存分配

ID:10278068

大小:49.00 KB

页数:6页

时间:2018-06-14

析构函数与动态内存分配_第1页
析构函数与动态内存分配_第2页
析构函数与动态内存分配_第3页
析构函数与动态内存分配_第4页
析构函数与动态内存分配_第5页
资源描述:

《析构函数与动态内存分配》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、8.1.3析构函数与动态内存分配我们以后会发现,程序中经常需要为类的数据成员动态分配内存。我们可以在构造函数中使用new运算符来为对象成员分配空间。在这种情况下,我们必须提供适当的析构函数,在不再需要该对象时释放空间。下面首先定义一个简单的类,以进行这样的练习。假设我们希望定义一个类,其中每个对象都是描述性的消息(如文本串)。这个类应该尽可能高效地利用内存,因此不能将数据成员定义成足以容纳所需最大长度字符串的char数组。我们应该在创建对象时在自由存储器中为消息分配内存。类定义如下所示:1.//

2、Listing08_012.classCMessage3.{4.private:5.char*pmessage;//Pointertoobjecttextstring6.7.public:8.9.//Functiontodisplayamessage10.voidShowIt()const11.{12.cout<

3、17.{18.pmessage=newchar[strlen(text)+1];//Allocatespacefortext19.strcpy(pmessage,text);//Copytexttonewmemory20.}21.22.~CMessage();//Destructorprototype1.};该类仅仅定义了一个数据成员pmessage。该成员是一个指向文本串的指针,是在类的private部分定义的,因此不能从类外部访问。在public部分,ShowIt()函数将CMessage对

4、象输出到屏幕上。我们还定义了构造函数,并添加了类析构函数的原型~CMessage()--我们很快就会讨论它。类的构造函数要求实参是字符串,但如果不传递任何实参,它将使用为形参指定的默认字符串。构造函数通过使用库函数strlen(),获得字符串实参的长度(不包括终止空字符)。为了使构造函数能够使用strlen()库函数,程序中必须有嵌入头文件的#include语句。通过将trlen()函数返回的数值加1,构造函数即可求出在自由存储器中存储该字符串所需的内存字节数。注意:当然,如果

5、内存分配失败,则将抛出异常,程序终止。如果我们希望管理此类故障,以便程序顺利运行,那么应该在构造函数代码中捕获此类异常(见第6章关于处理内存不足状况的信息)。在使用new运算符获得供字符串使用的内存之后,我们使用也是在头文件中声明的strcpy()库函数,将给构造函数提供的字符串实参复制到为字符串分配的内存中。strcpy()函数将第二个指针实参指定的字符串,复制到第一个指针实参包含的地址中。我们现在需要编写类的析构函数,以释放为消息分配的内存。如果不给该类提供析构函数,程序将

6、无法释放为类对象分配的内存。如果按照现状在创建大量CMessage对象的程序中使用这个类,那么自由存储器将逐渐被耗尽,直至程序失败为止。在不容易发现此类问题的环境中,却很容易出现上述现象。例如,如果我们要在一个被程序调用许多次的函数中创建临时的CMessage对象,则可能认为该对象将在从函数返回时被销毁。当然,这种看法是正确的,只是自由存储器中的内存没有被释放。因此,每调用一次该函数,就有更多的自由存储器内存被抛弃的CMessage对象占用。CMessage类析构函数的代码如下所示:1.//Li

7、sting08_021.//Destructortofreememoryallocatedbynew2.CMessage::~CMessage()3.{4.cout<<"Destructorcalled."//Justtotrackwhathappens5.<

8、生的事情,然后使用delete运算符释放pmessage成员指向的内存。注意,delete后面的方括号是必需的,因为我们是在删除数组(char类型)。试一试:使用消息类通过下面这个小小的示例,我们可以练习CMessage类的用法。1.//Ex8_02.cpp2.//Usingadestructortofreememory3.#include//ForstreamI/O4.#include//Forstrlen()andstrcpy()5.usingstd::

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。