我需要为我的班级创建一个+运算符,我这样做是这样的:

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和复制消除,因此您不必担心会制作其他副本。

08-19 12:47