先看一下代码:
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;
}