返回引用 vs 返回對(duì)象
先看一下代碼:
Date& getdate( )
{
Date dt = {6, 24, 40};
return dt;
}
C++編譯器會(huì)在返回局部變量的引用代碼時(shí)發(fā)出警告。原因是,一旦函數(shù)返回,局部變量dt占用的內(nèi)存塊就會(huì)從棧內(nèi)釋放,而返回的類型是“引用”,那么引用的對(duì)象的內(nèi)存已經(jīng)釋放,相應(yīng)內(nèi)存地址存放的內(nèi)容不能再保證是變量bt了,如果這時(shí)候其他設(shè)備或者任務(wù)中斷使用了棧內(nèi)存,那就會(huì)產(chǎn)生不可估計(jì)的錯(cuò)誤。
改進(jìn)的辦法有兩種:
一是:
Date getdate( )
{
Date dt = {6, 24, 40};
return dt;
}
這就使函數(shù)返回的類型不是引用類型,那么在函數(shù)結(jié)束前,將要被返回的局部變量dt會(huì)先被創(chuàng)建一個(gè)副本,然后函數(shù)結(jié)束了,dt占用的棧內(nèi)存消失了,但副本可以被返回。這是最常用的函數(shù)返回類型。
二是:
Date& getdate( )
{
static Date dt = {6, 24, 40};
return dt;
}
使變量dt的內(nèi)存分配在全局?jǐn)?shù)據(jù)區(qū)進(jìn)行,這樣的話,直到整個(gè)程序結(jié)束前,變量bt是不會(huì)消失的,那么對(duì)它的引用不會(huì)出現(xiàn)問(wèn)題。
Date& getdate( )
{
Date dt = {6, 24, 40};
return dt;
}
C++編譯器會(huì)在返回局部變量的引用代碼時(shí)發(fā)出警告。原因是,一旦函數(shù)返回,局部變量dt占用的內(nèi)存塊就會(huì)從棧內(nèi)釋放,而返回的類型是“引用”,那么引用的對(duì)象的內(nèi)存已經(jīng)釋放,相應(yīng)內(nèi)存地址存放的內(nèi)容不能再保證是變量bt了,如果這時(shí)候其他設(shè)備或者任務(wù)中斷使用了棧內(nèi)存,那就會(huì)產(chǎn)生不可估計(jì)的錯(cuò)誤。
改進(jìn)的辦法有兩種:
一是:
Date getdate( )
{
Date dt = {6, 24, 40};
return dt;
}
這就使函數(shù)返回的類型不是引用類型,那么在函數(shù)結(jié)束前,將要被返回的局部變量dt會(huì)先被創(chuàng)建一個(gè)副本,然后函數(shù)結(jié)束了,dt占用的棧內(nèi)存消失了,但副本可以被返回。這是最常用的函數(shù)返回類型。
二是:
Date& getdate( )
{
static Date dt = {6, 24, 40};
return dt;
}
使變量dt的內(nèi)存分配在全局?jǐn)?shù)據(jù)區(qū)進(jìn)行,這樣的話,直到整個(gè)程序結(jié)束前,變量bt是不會(huì)消失的,那么對(duì)它的引用不會(huì)出現(xiàn)問(wèn)題。
//----- 返回STL vector<string>對(duì)象,會(huì)有大量的內(nèi)存拷貝
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 肥仔 閱讀(669) 評(píng)論(0) 編輯 收藏 引用 所屬分類: C++ 基礎(chǔ)