class temp
{
private:
char *m_ptrSourse = NULL;
public:
temp(char *ptr)
{
m_ptrSourse = new char[strlen(ptr) + 1];
strcpy(m_ptrSourse, ptr);
}
temp& operator=(const temp &o)
{
if (&o == this)
{
return *this;
}
else
{
char *pOri = m_ptrSourse;
m_ptrSourse = new char[strlen(o.m_ptrSourse)+1];
strcpy(m_ptrSourse, o.m_ptrSourse);
delete pOri;
pOri = NULL;
return *this;
}
}
void show()
{
cout << m_ptrSourse << endl;
}
};
void main()
{
temp t1("jack1");
t1.show();
temp t2("jack2");
t2.show();
t1 = t2;
t1.show();
system("pause");
}
我们常规的做法如下:
temp& operator=(const temp &o)
{
if (&o == this)
{
return *this;
}
else
{
delete m_ptrSourse;
m_ptrSourse = new char[strlen(o.m_ptrSourse) + 1];
return *this;
}
}
但这不具备异常安全性,原因:如果new char[strlen(o.m_ptrSourse) + 1];失败,temp最终指向一块被删除的内存。这样的指针有害。 而正确的做法就是综合代码中那样。即使new出错,m_ptrSourse及其栖身的那个temp还是会保持原状。
|