淺談返回函數(shù)內(nèi)部new分配的內(nèi)存的引用
在bbs看到了一個帖子:為什么不能返回函數(shù)內(nèi)部new分配的內(nèi)存的引用?
lz是這樣問的:
按照這句話,
string& foo() { string* str = new string("abc"); return *str; }
非法的,為什么?
其實,不能說這是非法的,只能說這種u編程習(xí)慣很不好,這樣很可能造成內(nèi)存泄露。
后面還有個回復(fù)是這樣的:
struct a_s { int a; }; a_s* foo() { struct a_s* sp = new struct a_s; return sp; }
這個挺好啊,為什么換成reference就泄漏了?
不能說這樣寫就挺好,這樣寫跟lz寫的都是一個道理,也并不是說這樣寫就內(nèi)存泄露了,只是說,這樣寫很容易造成內(nèi)存泄露。程序員在編寫代碼時,為了避免內(nèi)存泄露,必須保證對每個用new產(chǎn)生的指針調(diào)用delete釋放。
如果按照以上兩種做法,即使很小心的程序員也難免會造成內(nèi)存泄露。
比如:string str = foo(); 顯然new生成的這塊內(nèi)存將無法釋放。
只能這樣:
string& tmp = foo(); string str = tmp; delete &tmp;
這樣就不會造成內(nèi)存泄露了。 但是每次的這樣就是誰都覺得煩。而且暗藏殺機啊,比如:string str = "hello" + foo(); 上式不知不覺就造成內(nèi)存泄露了。所以,即使很小心的程序員也難免會造成內(nèi)存泄露。
為了證明我的思想,我寫了測試代碼:(vs2008調(diào)式通過)
#include <iostream> using namespace std; class example { public: example() { num = new int; *num = 10; cout<<"num = "<<*num<<endl; cout<<"構(gòu)造"<<endl; } ~example() { cout<<"析構(gòu)"<<endl; delete num; } void pingfang() { *num *= *num; } void print() { cout<<*num<<endl; } private: int *num; }; example & diaoyong1() { example * p = new example; p->pingfang(); return *p; } example * diaoyong2() { example * p = new example; p->pingfang(); return p; } int main(void) { example & e1 = diaoyong1(); e1.print(); delete &e1; example * ptr = diaoyong2(); ptr->print(); delete ptr; getchar(); return 0; }
運行結(jié)果如下:
num = 10
構(gòu)造
100
析構(gòu)
num = 10
構(gòu)造
100
析構(gòu)
從運行結(jié)果來看:我的結(jié)論如下:
并不是說返回函數(shù)內(nèi)存new分配的內(nèi)存的引用或指針是非法的,只是說如果要返回,必須要十分注意,因為很有可能造成內(nèi)存泄露。所以一般不提倡返回函數(shù)內(nèi)存new分配的內(nèi)存的引用或指針。
以上就是小編為大家?guī)淼臏\談返回函數(shù)內(nèi)部new分配的內(nèi)存的引用全部內(nèi)容了,希望大家多多支持我們~
上一篇:循環(huán)隊列詳解及隊列的順序表示和實現(xiàn)
欄 目:C語言
下一篇:關(guān)于STL的erase()陷阱-迭代器失效問題的總結(jié)
本文標(biāo)題:淺談返回函數(shù)內(nèi)部new分配的內(nèi)存的引用
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1889.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對數(shù)怎么表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文