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