使用流的字符串连接返回垃圾
string concatenation using streams returns junk
我可能应该开始声明我对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 *
而从未释放它来泄漏内存?
string::c_str()
返回的 char 指针仅在字符串的生存期内有效(并且仅在未修改时有效)。
但是stream.str()
返回一个临时字符串对象,您需要将其存储在某个地方。否则,它将在您调用该函数的确切语句之后被销毁。
但即使你写
string result = stream.str();
return result.c_str();
然后销毁函数内部的字符串对象,使 c_str()
返回的 char 指针无效,并在使用(取消引用)后立即导致未定义的行为。
最后,最好的方法是只返回一个字符串:
return stream.str();
你可以只做 返回strdup (stream.str().c_str())
,但你应该自己管理这个内存。
相关文章:
- 在函数中连接两个字符,并在 C++ 中返回输出
- Linux 套接字 recv 返回 -1,errno 110 连接超时
- 如何将两个 jlong 数据类型转换为 jstring,然后将两个字符串连接在一起以便从 JNI 将字符串返回给 jav
- C++所有 AT 命令的短信返回错误 |PC<->通过蓝牙和winsocket的移动连接
- C++ 套接字 read() 有时在连接到服务器时返回 -1
- qt如何连接QPushButton的2D数组并返回位置
- 返回打开的插座连接/留下套接字连接打开C
- 在参数包中获取函数指针的返回类型,并将其保存为与其他参数连接的元组
- C++线程连接会立即返回或不返回
- 有没有办法将C 中的两个阵列连接并返回它们
- 对象::连接:当 obj 作为shared_ptr返回时没有这样的信号
- 如何使用boost::any_range连接多个boost范围并作为函数w/o的结果返回
- 尝试通过二叉树中的递归返回字符串(连接)
- 命名管道:连接命名管道返回ERROR_BROKEN_PIPE后的读取文件
- 提升异步 TCP 客户端在没有物理连接的情况下写入时不返回错误
- C++返回对成员的连接文件,因此可以由同一类的其他方法使用
- 使用流的字符串连接返回垃圾
- 将返回对象的信号连接到没有参数的插槽
- 如何使用 Cython 连接返回C++自定义类的函数
- 是否有可能在c++代码中从mysql函数返回连接对象?