我正在创建我在.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是全局的,如果该信息有帮助的话。
答案 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);
left
和right
未更改,str
现在与left
具有相同的值。
str += v->at(obj.id);
left
和right
未更改,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
}