欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C語言

當(dāng)前位置:主頁 > 軟件編程 > C語言 >

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

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點擊: 次

在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

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有