剑指offer关于自动析构的有关问题
剑指offer关于自动析构的问题
剑指offer里面试题一有这么一段代码
//重载运算符
CMyString& CMyString::operator=(const CMyString& str)
{
if(this!=&str)
{
CMyString strTemp(str);//使用构造函数创建一个临时对象
//交换临时对象与当前对象的m_pData值
char* pTemp=strTemp.m_pData;
strTemp.m_pData=m_pData;
m_pData=pTemp;
}
return *this;
}
复制代码
这样的一个好处是在运行完if语句以后,因为除了strTemp的作用于,该实例会自动调用析构函数,把strTemp.m_pData所指向的内存释放掉,而此时strTemp.m_pData指向的是实例原先m_pData指向的内存,并没有释放当前指向的pTemp这一块内存。还有一点是通过构造函数为临时实例分配内存,如果在new char过程中抛出异常,并没有改变该实例m_pData所指向的内容,也没有释放内存,所以是异常安全性的。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
问题是,如果m_pData初始指向的是堆中的内存,析构函数会自动析构掉这个内存么?
------解决思路----------------------
按他的说法,m_pData至始至终都是指向堆上的内存(用new分配的)
这里要结合CMyString的构造函数和析构函数来看,你把构造函数在if块开头展开,析构函数在if块结尾展开就差不多能理解了
剑指offer里面试题一有这么一段代码
//重载运算符
CMyString& CMyString::operator=(const CMyString& str)
{
if(this!=&str)
{
CMyString strTemp(str);//使用构造函数创建一个临时对象
//交换临时对象与当前对象的m_pData值
char* pTemp=strTemp.m_pData;
strTemp.m_pData=m_pData;
m_pData=pTemp;
}
return *this;
}
复制代码
这样的一个好处是在运行完if语句以后,因为除了strTemp的作用于,该实例会自动调用析构函数,把strTemp.m_pData所指向的内存释放掉,而此时strTemp.m_pData指向的是实例原先m_pData指向的内存,并没有释放当前指向的pTemp这一块内存。还有一点是通过构造函数为临时实例分配内存,如果在new char过程中抛出异常,并没有改变该实例m_pData所指向的内容,也没有释放内存,所以是异常安全性的。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
问题是,如果m_pData初始指向的是堆中的内存,析构函数会自动析构掉这个内存么?
------解决思路----------------------
按他的说法,m_pData至始至终都是指向堆上的内存(用new分配的)
这里要结合CMyString的构造函数和析构函数来看,你把构造函数在if块开头展开,析构函数在if块结尾展开就差不多能理解了