函数返回临时对象行为不端

Vid*_*dak 1 c++ oop string function return-value

好的,非常简单的String类,它保存常量字符串(即初始化后不能更改),实现复制ctor和连接功能conc.这个函数给了我麻烦,因为我真的无法弄清楚为什么我做的局部变量不能正常传递为返回值.

码:

class String
{
public:
    String(char*);
    String(const String& other);
    ~String();
    friend String conc(const String&, const String&);
    friend std::ostream& operator<<(std::ostream&, const String&);
private:
    const char* const str;
};

String::String(char* aStr) : str(aStr) {}

String::String(const String& other) : str(other.str) {}

std::ostream& operator<<(std::ostream& out, const String& s)
{
    out<<s.str<<"\n";
    return out;
}

String::~String()
{
    delete str;
}

String conc(const String& s1, const String& s2)
{
    int n = strlen(s1.str) + strlen(s2.str);
    int i, j;
    char* newS = new char[n+1];
    for(i = 0; i < strlen(s1.str); ++i)
    {
        newS[i] = s1.str[i];
    }
    for(j = 0; j < strlen(s2.str); ++j)
    {
        newS[i+j] = s2.str[j];
    }
    newS[i+j] = '\0';  //newS is made correctly 
    String tmp(newS); // the tmp object is made correctly
    return tmp;   // here tmp becomes something else --- Why??
}

int main()
{
    String s1("first");
    String s2("SECOND");

    String s3 = conc(s1, s2); //here the copy ctor should be called, right?
    std::cout<<s3;
    _getch();
}
Run Code Online (Sandbox Code Playgroud)

正如您在评论中看到的那样,问题出conc在最后的函数中.我已经使函数返回a String,而不是String&故意的,因为它返回的值不应该是左值...

请解释和帮助,谢谢!:)

Pet*_*ker 6

这里到处都有内存管理问题.每个String对象都应该拥有自己的内存.这意味着String::String(char*)需要分配一个char数组并复制输入字符串的内容; String::String(const String&)需要分配一个char数组并复制输入字符串的内容; 并且String::operator=需要删除自己的字符串(除非它与输入字符串相同),分配一个char数组,并复制输入字符串的内容.最后,String::~String()应该delete[]是char数组.