返回信息流如下代码应该是可以的吧? 是不是不存在返回局部数组的问题? 返回值是std::string
std::string get() {
char tmp[1024];
snprintf(tmp, sizeof(tmp), "%s", "hello world!");
return tmp;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #88230同步于 2015/8/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
返回局部数组
xiaobing307
2015/8/3镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
可以正常编译通过,但调用时可能得不到正确的结果。tmp[1024]是个局部数组,当函数调用结束,局部变量tmp被释放掉,所以返回的结果是不确定或不安全的。可以改第2行为static char tmp[1024]。
一直也想知道这种情况是怎么处理的,保险起见
我都是改为返回指针,在函数内
std::string* strp =new std::string(tmp);
return strp;
函数外面使用完后再
delete (std::string *)
我理解,返回之前,会马上进行一次转换,将char*转换为string。这个过程会隐式地调用std::string(char* s)这个构造函数[我不是很自信,如果我错了,告诉我]。
http://en.cppreference.com/w/cpp/string/basic_string/basic_string
根据这里的叙述,下面这个构造函数:
basic_string( const CharT* s,
const Allocator& alloc = Allocator() );
的意思是复制s的内容到新的字符串对象中。
然后,一个str:string类型的对象(而不是指针)作为返回值返回,里面的内容会再次拷贝给调用函数的表达式。当然,优化器允许疯狂地优化、消除这种拷贝,即使拷贝有副作用也可以。
所以,按上面这种说法,这个函数是安全的,不会有问题。[如果我错了,告诉我]
返回值是std::string
【 在 zhw1242 的大作中提到: 】
: 可以正常编译通过,但调用时可能得不到正确的结果。tmp[1024]是个局部数组,当函数调用结束,局部变量tmp被释放掉,所以返回的结果是不确定或不安全的。可以改第2行为static char tmp[1024]。
没觉得有啥问题。请问如何重现你说的“崩掉”?
【 在 shan10211865 的大作中提到: 】
: 之前试过楼主这样用,运行的时候第一次正常,后面会崩掉,原因可能就是sf说的,内存释放掉了