这个复制赋值操作安全吗?

Is this copy assignment operation safe?

#include<string>

class HasPtr {
public:
    HasPtr(const std::string &s = std::string()) :
        ps(new std::string(s)), i(0) {}
    HasPtr(const HasPtr &orig) :ps(new std::string(*orig.ps)), i(orig.i) {}
    HasPtr &operator=(const HasPtr &rhs) {
        *ps = *rhs.ps;
        i = rhs.i;
        return *this;
    }
private:
    std::string *ps;
    int i;
};

当我将一个数据成员ps指向一个大字符串的HasPtr分配给另一个时, 我是否有可能导致内存损坏?例如:

HasPtr a;
HasPtr b(string("123456789...123456789"));
a=b;

显示的代码缺少析构函数,这将导致内存泄漏。

添加适当的析构函数后,生成 class will be perfectly Rule-Of-Three compliant。因此,不会有任何与内存相关的问题。

std::string在运行过程中用完内存时,会抛出异常,所以进程不会破坏内存。

按值保留 std::string。除了作为一个字符串抽象,它还是一种资源管理class,所以就这样使用吧。如果这样做,您的 class 将符合 0/3/5 规则,无需您付出任何额外努力。