我的简单字符串实现错了

时间:2011-04-01 22:01:29

标签: 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;
}

我认为问题所在的代码:

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

这是输出:

1 2 3
End!


    ╠╠╠╠╠╠╠╠∟       ╠╠╠╠╠╠╠╠
Press any key to continue . . .

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

由于您处理/保存字符串的方式,您的代码无效:

您实际上从不修改分配给当前实例的字符串。你这样做的方式可以在C#中工作(在某种程度上)但不能在C ++中工作。

让我们一步一步来做:

假设this的值(我只是将其称为left)是“Hello”,另一个字符串的值(obj - 我会称之为right 1}})是“世界”。 operator +的预期行为是将right附加到left并返回整个字符串。

std::string str = v->at(this->id);

leftright未更改,str现在与left具有相同的值。

str += v->at(obj.id);

leftright未更改,however str`现在包含“HelloWorld”。

现在返回指向str的指针在理论上是正确的,但正如Erik已经提到的那样,这个指针将无效(如果你很幸运它可能仍然有效,但不要假设这!)。

以下是我实施它的方法:

String& String::operator+(String& other) // pass the other string by value to avoid it being copied!
{
    v->at(this->id) += v->at(other->id); // append the string using std::string's + operator
    return *this; // return this object
}
相关问题