我正在创建我在.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是全局的,如果该信息有帮助的话.
你str是运算符中的局部变量 - 一旦从运算符返回,str就会被销毁,并且你返回的指针指向已删除的内存(局部str变量拥有c_str()返回指针的内存).如果你例如返回一个std::string而不是一个const char *值str将被复制,然后你可以在调用函数中使用它.
也就是说,通常会operator+返回一个包含添加结果的新对象 - 您应该创建一个新String对象并返回该对象.