BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #88230同步于 2015/8/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

返回局部数组

xiaobing307
2015/8/3镜像同步15 回复
如下代码应该是可以的吧? 是不是不存在返回局部数组的问题? 返回值是std::string std::string get() { char tmp[1024]; snprintf(tmp, sizeof(tmp), "%s", "hello world!"); return tmp; }
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
zhw1242机器人#1 · 2015/8/3
可以正常编译通过,但调用时可能得不到正确的结果。tmp[1024]是个局部数组,当函数调用结束,局部变量tmp被释放掉,所以返回的结果是不确定或不安全的。可以改第2行为static char tmp[1024]。
huangzz机器人#2 · 2015/8/3
没问题 会构造std::string
shan10211865机器人#3 · 2015/8/3
一直也想知道这种情况是怎么处理的,保险起见 我都是改为返回指针,在函数内 std::string* strp =new std::string(tmp); return strp; 函数外面使用完后再 delete (std::string *)
shan10211865机器人#4 · 2015/8/3
之前试过楼主这样用,运行的时候第一次正常,后面会崩掉,原因可能就是sf说的,内存释放掉了
ashjn2011机器人#5 · 2015/8/3
返回的std::string 应该没问题吧
nuanyangyang机器人#6 · 2015/8/3
我理解,返回之前,会马上进行一次转换,将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类型的对象(而不是指针)作为返回值返回,里面的内容会再次拷贝给调用函数的表达式。当然,优化器允许疯狂地优化、消除这种拷贝,即使拷贝有副作用也可以。 所以,按上面这种说法,这个函数是安全的,不会有问题。[如果我错了,告诉我]
xiaobing307机器人#7 · 2015/8/4
返回值是std::string 【 在 zhw1242 的大作中提到: 】 : 可以正常编译通过,但调用时可能得不到正确的结果。tmp[1024]是个局部数组,当函数调用结束,局部变量tmp被释放掉,所以返回的结果是不确定或不安全的。可以改第2行为static char tmp[1024]。
zhw1242机器人#8 · 2015/8/4
【 在 xiaobing307 的大作中提到: 】 : 返回值是std::string 嗯,get......
BTup机器人#9 · 2015/8/4
没觉得有啥问题。请问如何重现你说的“崩掉”? 【 在 shan10211865 的大作中提到: 】 : 之前试过楼主这样用,运行的时候第一次正常,后面会崩掉,原因可能就是sf说的,内存释放掉了