gpt4 book ai didi

c++ - 如何正确释放返回值

转载 作者:行者123 更新时间:2023-11-27 22:44:45 24 4
gpt4 key购买 nike

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

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

它似乎按预期工作,但我发现释放内存有问题。在我归还它的那一刻,它可能已经是别的东西了。所以这是未定义的行为,我说得对吗?
如何避免这种情况?

最佳答案

So it is undefined behaviour, am I correct?

是的。

How to avoid that?

有几种方法。

  1. 按值返回

    CDoubleString operator + (const CDoubleString & y){
    CDoubleString n(textA,textB);
    n.textA+=y.textA;
    n.textB+=y.textB;
    return n;
    }
  2. 返回一个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 和复制列表,因此您无需担心制作的额外拷贝。

关于c++ - 如何正确释放返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44482150/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com