这个复制赋值操作安全吗?
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 规则,无需您付出任何额外努力。
#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 规则,无需您付出任何额外努力。