CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

C++的问题,应该是编译器的吧

楼主zgt410(原来如此)2004-04-02 13:50:48 在 C/C++ / 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

相关问题

  • lcc是c编译器还是c++编译器(给分)
  • c编译器
  • C#的编译器是哪个?
  • C#的编译器
  • C的编译器
  • dev-c++编译器
  • 求c#编译器
  • 想学C++应该看什么书?用什么编译器?
  • 学习C++应该用什么编译器?
  • 哪些C/C++的编译器是32位的?

关键词

  • vc++
  • 编译器
  • 引用
  • 局部变量
  • 返回
  • abcdefg
  • getstr
  • auto
  • ret
  • std

得分解答快速导航

  • 帖主:zgt410
  • keiy
  • xueweizhong
  • xueweizhong

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo