我的简单字符串实现错了

Dan*_*pez 0 c++ string

我正在创建我在.Net框架中的String类的简单实现.唯一的区别是,如果你知道我的意思,那就不那么含糖了.无论如何,除了+运算符的重载运算符之外,我得到了所有工作; 最终显示垃圾缓冲区.我还没有实现异常处理或垃圾收集.如果你都很好奇,下面是代码和输出.

#include <iostream>
using namespace std;
using namespace CDataTypes;
int _tmain(int argc, _TCHAR* argv[])
{
    String* str = new String();
    *str = "1 ";
    String* str2 = new String();
    *str2 = "2 ";
    String* str3 = new String();
    *str3 =  "3 ";
    String* str4 = new String("\nEnd!\n");
    cout << str->GetText() << str2->GetText() << str3->GetText() << str4->GetText() << endl;
    const char* s = *str + "H"; // Here is where it goes wrong!
    String* cat = new String();
    cout << "\n" << s << endl;
    system("pause");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

代码我认为问题所在:

    const char* String::operator+(char obj[])
    {
        std::string str = v->at(this->id);
        str += obj;
        ptr = str.c_str();
        return ptr;
    }
    const char* String::operator+(String obj)
    {
        std::string str = v->at(this->id);
        str += v->at(obj.id);
        ptr = str.c_str();
        return ptr;
    }
Run Code Online (Sandbox Code Playgroud)

这是输出:

1 2 3
End!


    ?????????       ????????
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)

PS我做了一些调试,变量ptr没有显示垃圾.所以我的问题是它如何归还垃圾?顺便说一句,变量ptr是全局的,如果该信息有帮助的话.

Eri*_*rik 6

str是运算符中的局部变量 - 一旦从运算符返回,str就会被销毁,并且你返回的指针指向已删除的内存(局部str变量拥有c_str()返回指针的内存).如果你例如返回一个std::string而不是一个const char *str将被复制,然后你可以在调用函数中使用它.

也就是说,通常会operator+返回一个包含添加结果的新对象 - 您应该创建一个新String对象并返回该对象.

  • 它是local - `std :: string str = v-> at(this-> id);`通过从(v-> at(this-> id)复制来创建一个新的本地`str`变量` (2认同)