C++ Primer(第5版) 练习 13.23
练习 13.23 比较上一节练习中你编写的拷贝控制成员和这一节中的代码。确定你理解了你的代码和我们的代码之间的差异(如果有的话)。
环境:Linux Ubuntu(云服务器)
工具:vim
代码块
自己写的
class HasPtr{
public:
HasPtr(const std::string &s = std::string()): ps(new std::string(s)), i(0) {}
HasPtr(const HasPtr &);
HasPtr &operator= (const HasPtr &);
~HasPtr() { delete ps; }
private:
std::string *ps;
int i;
};
HasPtr::HasPtr(const HasPtr &h){
ps = new string(*h.ps);
i = h.i;
}
HasPtr::HasPtr &operator= (const HasPtr &h){
ps = new string(*h.ps);
i = h.i;
return *this;
}
本书写的
class HasPtr{
public:
HasPtr(const string &s = string()): ps(new string(s)), i(0) {}
HasPtr(const HasPtr &p): ps(new string(*p.ps)), i(p.i) {}
HasPtr &operator= (const HasPtr &);
~HasPtr() { delete ps; }
private:
string *ps;
int i;
};
HasPtr& HasPtr::operator= (const HasPtr &rhs){
auto newp = new string(*rhs.ps);
delete ps;
ps = newp;
i = rhs.i;
return *this;
}
差异应该在于释放ps指向的旧内存上,应该是释放原先的指向。