此复制分配操作是否安全?

时间:2016-11-28 03:23:17

标签: c++ memory-corruption copy-assignment

Error in gzfile(file, "wb") : cannot open the connection
In addition: Warning message:
In gzfile(file, "wb") :
cannot open compressed file 'data/multiple.rdata', probable reason 'No such     
file or directory'

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

#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;
};

3 个答案:

答案 0 :(得分:1)

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

添加适当的析构函数后,生成的类will be perfectly Rule-Of-Three compliant。因此,不会出现任何与记忆相关的问题。

答案 1 :(得分:1)

按值std::string按住。除了作为字符串抽象之外,它还是一个资源管理类,因此请使用它。如果您这样做,您的课程将符合0/3/5规则,而无需您做任何额外的努力。

答案 2 :(得分:0)

std::string在操作期间耗尽内存时,会抛出异常,因此该过程不会破坏内存。