使用streams的字符串连接返回垃圾

时间:2014-12-29 12:05:54

标签: c++ stream buffer iostream cstring

我可能应该开始说我是C +的新手,而且,由于我来自更高级别的语言,我可能会遗漏一些我无法识别的技术问题。

我有以下方法:

const char * Point::toString() const {
    std::ostringstream stream;
    stream << "[" << x << ", " << y << "]"; //[3, 5] for example
    return stream.str().c_str();
}

然后我这样称呼它:

Point p1 (3, 5);
std::cout << p1.toString() << std::endl;

然而,这会打印一些垃圾。

我做错了什么?另外,我的toString()方法真的有效吗?我是通过分配一个新的char *来泄漏记忆而永远不会释放它吗?

2 个答案:

答案 0 :(得分:2)

string::c_str()返回的char指针仅在字符串的生命周期内有效(并且仅在未修改时)。

stream.str()会返回临时字符串对象,您需要将其存储在某个位置。否则,在您调用该函数的确切语句之后,它将被销毁

但即使你写了

string result = stream.str();
return result.c_str();

然后你破坏函数内部的字符串对象,使c_str()返回的字符指针无效,并在使用(解除引用)后立即导致未定义的行为。

最后,最好只返回一个字符串:

return stream.str();

答案 1 :(得分:0)

你可以回复strdup (stream.str().c_str()),但你应该自己管理这段记忆。