1

我在编译代码时收到警告。警告是:对返回的局部变量“str”的引用 [默认启用] 我不知道是什么问题或我做错了什么..这是我的代码.. .

MyString& operator+(MyString &a){
    char *tmp=new char[strlen(szArr)+strlen(a.szArr)+1];
    strcpy(tmp, szArr);
    strcat(tmp, a.szArr);
    MyString str(tmp);
    delete tmp;
    return str;
}
MyString& operator+(char *s){
    if(s)
        return *this;
    char *tmp=new char[strlen(szArr)+strlen(s)+1];
    strcpy(tmp, szArr);
    strcat(tmp, s);
    MyString str(tmp);
    delete tmp;
    return str;
}

在这两个我得到这个警告..我不知道为什么抱怨我返回对象..

4

5 回答 5

3

您正在返回对函数返回时超出范围的本地(堆栈)变量的引用。该对象将无效,因此编译器警告您不要这样做。确保您已经定义了一个复制构造函数并按值返回对象(&从返回类型中删除)。

于 2013-08-12T18:58:07.843 回答
1

如果您要返回一个新对象而不是一个已经存在的对象,则不应返回引用。删除引用令牌。(当函数返回时,您构造的对象将被破坏,因此引用将针对无效对象。返回非引用意味着该对象将被复制/移动,这正是您想要的。优化编译器将省略无论如何都要复制。)

此外,由于您不修改参数,因此应声明它们const以便const可以传入对象(或字符串文字)。

MyString& operator+(MyString &a);
MyString& operator+(char *s);

应该:

MyString operator+(MyString const &a);
MyString operator+(char const *s);

请注意,此逻辑是向后的:

if(s)
    return *this;

如果字符串不为空,这将无操作。我想你的意思是这样的:

if(!s)
    return *this;
于 2013-08-12T18:58:15.797 回答
0

另一个建议:您可以使用带有两个函数参数的运算符形式并保留按引用返回。

看看这里的例子

于 2013-08-12T19:10:29.830 回答
0

您正在函数内创建一个临时MyString str(tmp);变量,然后您试图返回对该变量内存的引用,该变量已超出范围。

我不确定这是否是您的错误消息的确切原因,但每当您尝试将该返回值用于任何事情时都会遇到问题。

于 2013-08-12T18:58:57.633 回答
0

该错误正是编译器告诉您的:您正在返回对局部变量的引用。局部变量存储在堆栈中,当函数结束时,其局部变量超出范围,因此返回对局部变量的引用具有未定义的行为。
您必须使用按值返回。

于 2013-08-12T18:59:38.770 回答