- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
析构函数与动态内存分配
8.1.3 析构函数与动态内存分配
我们以后会发现,程序中经常需要为类的数据成员动态分配内存。我们可以在构造函数中使用new运算符来为对象成员分配空间。在这种情况下,我们必须提供适当的析构函数,在不再需要该对象时释放空间。下面首先定义一个简单的类,以进行这样的练习。
假设我们希望定义一个类,其中每个对象都是描述性的消息(如文本串)。这个类应该尽可能高效地利用内存,因此不能将数据成员定义成足以容纳所需最大长度字符串的char数组。我们应该在创建对象时在自由存储器中为消息分配内存。类定义如下所示:
//Listing 08_01
class CMessage
{
private:
char* pmessage; // Pointer to object text string
public:
// Function to display a message
void ShowIt() const
{
cout endl pmessage;
}
// Constructor definition
CMessage(const char* text = Default message)
{
pmessage = new char[strlen(text) + 1]; // Allocate space for text
strcpy(pmessage, text); // Copy text to new memory
}
~CMessage(); // Destructor prototype
};
该类仅仅定义了一个数据成员pmessage。该成员是一个指向文本串的指针,是在类的private部分定义的,因此不能从类外部访问。
在public部分,ShowIt()函数将CMessage对象输出到屏幕上。我们还定义了构造函数,并添加了类析构函数的原型~CMessage()-- 我们很快就会讨论它。
类的构造函数要求实参是字符串,但如果不传递任何实参,它将使用为形参指定的默认字符串。构造函数通过使用库函数strlen(),获得字符串实参的长度(不包括终止空字符)。为了使构造函数能够使用strlen()库函数,程序中必须有嵌入cstring头文件的#include语句。通过将trlen()函数返回的数值加1,构造函数即可求出在自由存储器中存储该字符串所需的内存字节数。
注意:
当然,如果内存分配失败,则将抛出异常,程序终止。如果我们希望管理此类故障,以便程序顺利运行,那么应该在构造函数代码中捕获此类异常(见第6章关于处理内存不足状况的信息)。
在使用new运算符获得供字符串使用的内存之后,我们使用也是在cstring头文件中声明的strcpy()库函数,将给构造函数提供的字符串实参复制到为字符串分配的内存中。strcpy()函数将第二个指针实参指定的字符串,复制到第一个指针实参包含的地址中。
我们现在需要编写类的析构函数,以释放为消息分配的内存。如果不给该类提供析构函数,程序将无法释放为类对象分配的内存。如果按照现状在创建大量CMessage对象的程序中使用这个类,那么自由存储器将逐渐被耗尽,直至程序失败为止。在不容易发现此类问题的环境中,却很容易出现上述现象。例如,如果我们要在一个被程序调用许多次的函数中创建临时的CMessage对象,则可能认为该对象将在从函数返回时被销毁。当然,这种看法是正确的,只是自由存储器中的内存没有被释放。因此,每调用一次该函数,就有更多的自由存储器内存被抛弃的CMessage对象占用。
CMessage类析构函数的代码如下所示:
// Listing 08_02
// Destructor to free memory allocated by new
CMessage::~CMessage()
{
cout Destructor called. // Just to track what happens
endl;
delete[] pmessage; // Free memory assigned to pointer
}
因为是在类定义外部定义析构函数,所以我们必须以类名CMessage限定析构函数名。析构函数的作用只是显示一条消息,告诉我们所发生的事情,然后使用delete运算符释放pmessage成员指向的内存。注意,delete后面的方括号是必需的,因为我们是在删除数组(char类型)。
试一试:使用消息类
通过下面这个小小的示例,我们可以练习CMessage类的用法。
// Ex8_02.cpp
// Using a d
您可能关注的文档
最近下载
- 《新时代职业英语》教学资源_传媒英语_Unit_6_.pptx VIP
- 中医临床执业医师考试题及答案2025版.docx VIP
- 超声中信号处理.ppt VIP
- 《新时代职业英语》教学资源_传媒英语_Unit_7_.pptx VIP
- 部编人教版道德与法治五年级上册《全册课件》.pptx
- 《新时代职业英语》教学资源_传媒英语_Unit_9.pptx VIP
- 宝钢质量管理经验.doc VIP
- 勿忘历史,珍爱和平——抗战胜利80周年主题班会-2025-2026学年初中主题班会优质课件.pptx VIP
- Kuka控制系统 KR C5安装指南.pdf VIP
- 学习2025年《初中初三开学第一课》.pptx VIP
文档评论(0)