woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

返回引用 vs 返回对象

先看一下代码:

       Date&  getdate( )
       {
             Date  dt  =  {6,  24,  40};
             return  dt;
       }

       C++编译器会在返回局部变量的引用代码时发出警告。原因是,一旦函数返回,局部变量dt占用的内存块就会从栈内释放,而返回的类型是“引用”,那么引用的对象的内存已经释放,相应内存地址存放的内容不能再保证是变量bt了,如果这时候其他设备或者任务中断使用了栈内存,那就会产生不可估计的错误。

        改进的办法有两种:
        一是:

       Date  getdate( )
       {
             Date  dt  =  {6,  24,  40};
             return  dt;
       }

       这就使函数返回的类型不是引用类型,那么在函数结束前,将要被返回的局部变量dt会先被创建一个副本,然后函数结束了,dt占用的栈内存消失了,但副本可以被返回。这是最常用的函数返回类型。

       二是:

       Date&  getdate( )
       {
             static Date  dt  =  {6,  24,  40};
             return  dt;
       }

        使变量dt的内存分配在全局数据区进行,这样的话,直到整个程序结束前,变量bt是不会消失的,那么对它的引用不会出现问题。

//----- 返回STL vector<string>对象,会有大量的内存拷贝
vector<string> CToleranceTemplates::GetAllTemplateNames()
{
 vector<string> vec_names;
 for(iter_tolerances = m_mapTolerances.begin(); m_mapTolerances.end() != iter_tolerances; ++iter_tolerances)
  vec_names.push_back(iter_tolerances->first);
 return vec_names;
}

posted on 2008-01-30 13:47 肥仔 阅读(660) 评论(0)  编辑 收藏 引用 所属分类: C++ 基础


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理