国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

淺談返回函數(shù)內(nèi)部new分配的內(nèi)存的引用

2020-01-26 14:20:49
字體:
供稿:網(wǎng)友

在bbs看到了一個(gè)帖子:為什么不能返回函數(shù)內(nèi)部new分配的內(nèi)存的引用?

lz是這樣問的:

按照這句話,

string& foo(){string* str = new string("abc");return *str; }

非法的,為什么?

其實(shí),不能說這是非法的,只能說這種u編程習(xí)慣很不好,這樣很可能造成內(nèi)存泄露。

后面還有個(gè)回復(fù)是這樣的:

struct a_s{int a;};a_s* foo(){  struct a_s* sp = new struct a_s;  return sp;}

這個(gè)挺好啊,為什么換成reference就泄漏了?

不能說這樣寫就挺好,這樣寫跟lz寫的都是一個(gè)道理,也并不是說這樣寫就內(nèi)存泄露了,只是說,這樣寫很容易造成內(nèi)存泄露。程序員在編寫代碼時(shí),為了避免內(nèi)存泄露,必須保證對每個(gè)用new產(chǎn)生的指針調(diào)用delete釋放。

如果按照以上兩種做法,即使很小心的程序員也難免會造成內(nèi)存泄露。

比如:string str = foo(); 顯然new生成的這塊內(nèi)存將無法釋放。

只能這樣:

string& tmp = foo();string str = tmp; delete &tmp;

這樣就不會造成內(nèi)存泄露了。 但是每次的這樣就是誰都覺得煩。而且暗藏殺機(jī)啊,比如: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;}

運(yùn)行結(jié)果如下:

num = 10
構(gòu)造
100
析構(gòu)
num = 10
構(gòu)造
100
析構(gòu)

從運(yùn)行結(jié)果來看:我的結(jié)論如下:

并不是說返回函數(shù)內(nèi)存new分配的內(nèi)存的引用或指針是非法的,只是說如果要返回,必須要十分注意,因?yàn)楹苡锌赡茉斐蓛?nèi)存泄露。所以一般不提倡返回函數(shù)內(nèi)存new分配的內(nèi)存的引用或指針。

以上就是小編為大家?guī)淼臏\談返回函數(shù)內(nèi)部new分配的內(nèi)存的引用全部內(nèi)容了,希望大家多多支持武林網(wǎng)~

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 西丰县| 梓潼县| 安新县| 喀喇沁旗| 吴桥县| 揭西县| 阿图什市| 微博| 阿瓦提县| 邯郸县| 河间市| 墨竹工卡县| 黑龙江省| 灵川县| 安远县| 尉氏县| 任丘市| 郎溪县| 区。| 海林市| 信丰县| 修水县| 克拉玛依市| 青川县| 昌都县| 马龙县| 桓仁| 宁陕县| 永平县| 白河县| 花垣县| 秭归县| 南平市| 石台县| 台东市| 宜丰县| 南岸区| 延安市| 新竹市| 科尔| 永济市|