提高C++代码质量 - [083]不要返回局部变量的引用
概述:不要返回局部變量的引用,也不要返回new生成的對象的引用。
?
寫一個(gè)復(fù)數(shù)類CComplex,支持復(fù)數(shù)的加法,代碼如下:
class CComplex
{
public:
????CComplex(float real = 0, float imagin = 0)
????????: m_real(real), m_imagin(imagin){}
????~CComplex(){}
private:
????float m_real;
????float m_imagin;
?
????friend const CComplex& operator +(const CComplex& lhs, const CComplex& rhs);
};
?
inline const CComplex& operator +(const CComplex& lhs, const CComplex& rhs)
{
????CComplex result(lhs.m_real + rhs.m_real, lhs.m_imagin + rhs.m_imagin);
????return result;
}
?
//用戶使用代碼
CComplex a(1.02f, 3.21f);
CComplex b(7.10f, 5.44f);
CComplex c = a + b;
const CComplex& d = a + b;
?
上面的代碼雖然在VS2010中可以運(yùn)行通過,但是會(huì)有一個(gè)警告:
warning C4172:返回局部變量或臨時(shí)變量的地址
那么,到底發(fā)生了什么呢?
首相,構(gòu)造了一個(gè)局部變量result,接著生成result的別名,并作為函數(shù)的返回值返回,賦值給外面的臨時(shí)變量,最后局部變量超出生命周期銷毀。而此時(shí)result的別名還存在,所以警告就產(chǎn)生了。
需要注意的是,在C++標(biāo)準(zhǔn)中,這樣做的結(jié)果是未知的。之所以在VS2010中得到了正確的結(jié)果,只能說運(yùn)氣比較好,微軟的工程師對此做了特殊處理。所以,不要返回局部變量的引用。
?
那么,如果我們返回new出來的對象引用會(huì)怎么樣呢?代碼如下:
inline const CComplex& operator +(const CComplex& lhs, const CComplex& rhs)
{
????CComplex *result = new CComplex(lhs.m_real + rhs.m_real, lhs.m_imagin + rhs.m_imagin);
????return *result;
}
?
//用戶使用代碼
CComplex a(1, 1);
CComplex b(1, 4);
?
const CComplex& c = a + b;
delete &c;
?
這樣的方式有兩個(gè)缺點(diǎn):
(1)operator +函數(shù)只申請內(nèi)存,易造成內(nèi)存泄漏,特別是在鏈?zhǔn)讲僮鲿r(shí),增加了用戶使用的負(fù)擔(dān)。
(2)內(nèi)存的申請與釋放不在同一模塊中,將一個(gè)函數(shù)功能硬生生地分到了兩個(gè)層次的函數(shù)中,這影響了模塊功能的完整性與單一性,破壞了函數(shù)的內(nèi)聚性。
所以,也不要返回new出來的對象引用。總結(jié)
以上是生活随笔為你收集整理的提高C++代码质量 - [083]不要返回局部变量的引用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言条件编译及编译预处理阶段
- 下一篇: 返回函数局部变量的指针和引用