首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
类CMyString的声明如下: class CMyString { public: CMyString(char* pData = NULL); CMyString(const CMyString& str); ~CMyString(void);
类CMyString的声明如下: class CMyString { public: CMyString(char* pData = NULL); CMyString(const CMyString& str); ~CMyString(void);
admin
2019-03-29
188
问题
类CMyString的声明如下:
class CMyString
{
public:
CMyString(char* pData = NULL);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& operator = (const CMyString& str);
private:
char* m_pData;
};
请实现其赋值运算符的重载函数,要求异常安全,即当对一个对象进行赋值时发生异常,对象的状态不能改变。
选项
答案
CMyString& CMyString::operator =(const CMyString &str) { if(this != &str) { CMyString strTemp(str); char* pTemp = strTemp.m_pData; strTemp.m_pData = m_pData; m_pData = pTemp; } return *this; } 该方案通过调用构造拷贝函数创建一个临时对象来分配内存。此时即使发生异常,对原来对象的状态没有影响。交换临时对象和需要赋值的对象的字符串指针之后,由于临时对象的生命周期结束,自动调用其析构函数释放需赋值对象的原来的字符串空间。整个函数不需要显式用到new、delete,内存的分配和释放都自动完成,因此代码显得比较优雅。
解析
首先我们来看一般C++教科书上给出的赋值运算符的重载函数:
CMyString& CMyString::operator =(const CMyString &str)
{
if(this == &str)
return *this;
delete []m_pData;
m_pData = NULL;
m_pData = new char[strlen(str.m_pData) + 1];
strcpy(m_pData, str.m_pData);
return *this;
}
我们知道,在分配内存时有可能发生异常。当执行语句new char[strlen(str.m_pData) + 1]发生异常时,程序将从该赋值运算符的重载函数退出不再执行。注意到这个时候语句delete []m_pData已经执行了。也就是说赋值操作没有完成,但原来对象的状态已经改变。也就是说不满足题目的异常安全的要求。
为了满足异常安全这个要求,一个简单的办法是掉换new、delete的顺序。先把内存new出来用一个临时指针保存起来,只有这个语句正常执行完成之后再执行delete。这样就能够保证异常安全了。
转载请注明原文地址:https://kaotiyun.com/show/gRmZ777K
0
程序员面试
相关试题推荐
Thecommitteehasanticipatedtheproblemsthat______intheroadconstructionproject.
TheUnitedStatesInterstateHighwaySystemisaninfrastructurefeatofunprecedentedproportions.Notonlydoesitjoinallfi
TheGreeksassumedthatthestructureoflanguagehadsomeconnectionwiththeprocessofthought,whichtookrootinEuropelon
Studyingiseasierwhenone______thebigpubliclibraries.
TheSecondWorldWar,______theearlieronein1914,promptedpublicconcernaboutthephysicalandintellectualwell-beingoft
删除串中指定的字符
利用MSN给bob@sina.com发送电子邮件内容“8号晚上到我家一起吃饭”。
计算机能直接识别和执行的语言是()A.机器语言B.高级语言C.数据库语言D.汇编程序
软盘写保护的作用是()。A.防止持签B.防止读盘C.防止显示D.防止写盘
在数据库系统中,“事务”是访问数据库并可能更新各种数据项的一个程序执行单元。为了保证数据完整性,要求数据库系统维护事务的原子性、一致性、隔离性和持久性。针对事务的这4种特性,考虑以下的架构设计场景:假设在某一个时刻只有一个活动的事务,为了保证事务
随机试题
可编程序控制器的输入、输出、辅助继电器、计时、计数的触点是()重复使用。
引入中级调度的目的是为了起到提高_______的利用率和系统吞吐量的作用。
患者,女,25岁,超声显示甲状腺长4.5cm,宽2.0cm,厚1.5cm,峡部0.3cm,甲状腺上动脉Vmax(峰值)25cm/s,阻力指数0.5,回声均匀,应考虑是
男,30岁。因咳嗽1个月余,伴低热、痰中带血7天就诊。肾移植术后1年。胸片示:左肺上叶尖段炎症,伴有空洞形成。最可能的诊断是
孙某投资设立了一家个人独资企业,在下列哪些情况下,该个人独资企业应当解散:
根据《行政处罚法》相关规定,下列表述正确的是()。
一、注意事项1.申论考试与传统的作文考试不同,是分析驾驭材料的能力与表达能力并重的考试。2.仔细阅读给定的资料,按照后面提出的“作答要求”依次作答在答题纸指定位置。二、给定资料1.近来,关于“世遗”的话题相当热门:2011年6
在人工概念形成过程中,有人在已形成的部分假设的基础上,根据主试的反馈,每次只考验一种假设,如果这种假设被证明是正确的,就保留它,否则就采用另一个假设。根据布鲁纳的研究,这个人使用的策略是
毛泽东关于社会主义社会的矛盾学说的内容有
【S1】【S2】
最新回复
(
0
)