C++的问题,应该是编译器的吧
string & getstr(void)
{
string str("abcdefg");
return str;
}
我知道这样不会有错,但str的生命期不是在在函数内吗?返回引用时相当于返回一个指针,这时候str的内存不会被释放掉吗? 我想知道是怎么做的啊
问题点数:20、回复次数:10Top
1 楼sharkhuang(走吧走吧!人总会慢慢长大~)回复于 2004-04-02 14:06:50 得分 0
错误用法Top
2 楼keiy()回复于 2004-04-02 14:18:36 得分 5
我不知你用什么编译器,这样肯定有问题
dev-cpp/vc++都会有warning
dev-cpp:[Warning] reference to local variable `str' returned
vc++: warning C4172: returning address of local variable or temporary
而bcb根本就不能编译通过
最简方法用
string & getstr(void)
{
static string str("abcdefg");
return str;
}Top
3 楼zgt410(原来如此)回复于 2004-04-06 17:24:27 得分 0
可是我看我那本书上是这样写的啊,看来小弟要换书了
非常感谢啊!!!
哈哈Top
4 楼steel007(小宝)(工作在windows和linux平台上)回复于 2004-04-06 19:55:21 得分 0
哇,看来你是的换书了~这么低级的错误~~Top
5 楼kingmirth()回复于 2004-04-06 20:05:48 得分 0
不能返回局部对象的引用Top
6 楼xueweizhong(薛卫忠)回复于 2004-04-06 22:45:54 得分 10
一个可选的替代方案:
#include <memory>
#include <string>
std::auto_ptr<std::string> getstr(void)
{
using namespace std;
auto_ptr<string> ret(new string("abcdefg"));
string& str = *ret;
// ... processing here ...
return ret;
}
Top
7 楼whaway(湘北清翔)回复于 2004-04-06 22:52:41 得分 0
这是返回局部对象的引用,
就是用了Static也还是返回局部对象的引用啊,
只不过是因为Static的局部变量的存储区和全局变量的存储区同为全局数据区,
骗过了编译器吧?
个人意见,请高手指点。Top
8 楼redleaves(程序员)回复于 2004-04-06 23:06:28 得分 0
TO xueweizhong(薛卫忠):
你这样是不是有点......
直接返回string不是更好?
string getstr(void) {
string str;
....
return str;
}
Top
9 楼litterliu(小牛)回复于 2004-04-07 10:01:33 得分 0
一个可选的替代方案:
#include <memory>
#include <string>
std::auto_ptr<std::string> getstr(void)
{
using namespace std;
auto_ptr<string> ret(new string("abcdefg"));
string& str = *ret;
// ... processing here ...
return ret;
}
返回的还是局部变量,没解决问题
string getstr(void) {
string str;
....
return str;
}
这样来得好,用static的作法,加重负担,还不如直接返回直了
Top
10 楼xueweizhong(薛卫忠)回复于 2004-04-07 11:50:22 得分 5
呵呵,兄弟们有点误解我的意思了。
也怪我没有解释清楚。
1 楼主的代码要返回引用的意图是很明显的:
std::string的拷贝是非常低效的
因为在大多数编译器的实现中,并没有采用引用计数。
2 既然intention是不采用低效的值拷贝,
那么可以利用std::auto_ptr的Move语义来实现一种
折衷的方案。
3 to litterliu(小牛):
返回的不是局部变量的引用,而是auto_ptr的值。
这里没有问题。
建议你去看一下关于auto_ptr方面的资料。Top




