我在编译代码时收到警告。警告是:引用局部变量'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;
}
在我得到这个警告的时候..我不知道为什么抱怨我回来了对象..
答案 0 :(得分:3)
当函数返回时,您将返回对本地(堆栈)变量的引用,该变量将超出范围。该对象将无效,因此编译器警告您不要这样做。
确保已定义了复制构造函数并按值返回对象(从返回类型中删除&
)。
答案 1 :(得分: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;
如果字符串不 null,这将是no-op。我认为你的意思是:
if(!s)
return *this;
答案 2 :(得分:0)
您正在函数中创建一个临时MyString str(tmp);
变量,然后您尝试返回对该变量的内存的引用,该变量已超出范围。
我不确定这是您的错误消息的确切原因,但是当您尝试将该返回值用于任何事情时,这将是一个问题。
答案 3 :(得分:0)
错误正是编译器告诉您的:您正在返回对本地变量的引用。局部变量存储在堆栈中,当函数结束时,其局部变量超出范围,因此返回对局部变量的引用具有未定义的行为。
您必须使用按值返回。
答案 4 :(得分:0)
另一个建议:您可以使用带有两个函数参数的运算符表单并保持按引用返回。
查看here示例