我需要为我的班级创建一个+运算符,我这样做是这样的:
class CDoubleString{
public:
string textA="";
string textB="";
CDoubleString(string x,string y) : textA(x),textB(y){}
CDoubleString & operator + (const CDoubleString & y){
CDoubleString * n=new CDoubleString(textA,textB);
n->textA+=y.textA;
n->textB+=y.textB;
delete n;
return *n;
}
}
看来它正在按预期方式工作,但是我看到释放内存存在问题。在我将其退回的那一刻,可能已经是另外一回事了。所以这是不确定的行为,对吗?
如何避免呢?
最佳答案
所以这是不确定的行为,对吗?
是。
如何避免呢?
有几种方法。
按价值回报
CDoubleString operator + (const CDoubleString & y){
CDoubleString n(textA,textB);
n.textA+=y.textA;
n.textB+=y.textB;
return n;
}
返回
std::unique_ptr
std::unique_ptr<CDoubleString> operator + (const CDoubleString & y){
std::unique_ptr<CDoubleString> n = std::make_unique<CDoubleString>(textA,textB);
n->textA+=y.textA;
n->textB+=y.textB;
return n;
}
对于您的情况,我希望选择第一种。对于大多数现代编译器,您可以依靠RVO和复制消除,因此您不必担心会制作其他副本。