最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2016年12月22日 09:49:50   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇淺談返回函數(shù)內(nèi)部new分配的內(nèi)存的引用。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

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

lz是這樣問(wèn)的:

按照這句話,

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

非法的,為什么?

其實(shí),不能說(shuō)這是非法的,只能說(shuō)這種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就泄漏了?

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

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

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

只能這樣:

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

這樣就不會(huì)造成內(nèi)存泄露了。 但是每次的這樣就是誰(shuí)都覺(jué)得煩。而且暗藏殺機(jī)啊,比如:string str = "hello" + foo(); 上式不知不覺(jué)就造成內(nèi)存泄露了。所以,即使很小心的程序員也難免會(huì)造成內(nèi)存泄露。

為了證明我的思想,我寫(xiě)了測(cè)試代碼:(vs2008調(diào)式通過(guò))

#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é)果來(lái)看:我的結(jié)論如下:

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

以上就是小編為大家?guī)?lái)的淺談返回函數(shù)內(nèi)部new分配的內(nèi)存的引用全部?jī)?nèi)容了,希望大家多多支持腳本之家~

相關(guān)文章

  • C語(yǔ)言中bool和float的用法實(shí)例解析

    C語(yǔ)言中bool和float的用法實(shí)例解析

    這篇文章主要介紹了C語(yǔ)言中bool類型和float類型的相關(guān)資料,bool類型用于聲明布爾變量,只有true和false兩種值,float類型用于存儲(chǔ)單精度浮點(diǎn)數(shù),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-11-11
  • 一文詳解C語(yǔ)言中文件相關(guān)函數(shù)的使用

    一文詳解C語(yǔ)言中文件相關(guān)函數(shù)的使用

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言中文件相關(guān)函數(shù)的使用,可以實(shí)現(xiàn)文件的讀寫(xiě)、打開(kāi)和關(guān)閉。文中通過(guò)示例進(jìn)行了詳細(xì)介紹,需要的可以參考一下
    2022-07-07
  • 談?wù)凜++學(xué)習(xí)之Pair的使用方法

    談?wù)凜++學(xué)習(xí)之Pair的使用方法

    pair是一種模板類型,其中包含兩個(gè)數(shù)據(jù)值,兩個(gè)數(shù)據(jù)的類型可以不同,本篇詳細(xì)的介紹了Pair的使用方法和實(shí)例,有興趣的同學(xué)可以了解一下。
    2016-12-12
  • stl容器set,map,vector之erase用法與返回值詳細(xì)解析

    stl容器set,map,vector之erase用法與返回值詳細(xì)解析

    在使用 list、set 或 map遍歷刪除某些元素時(shí)可以這樣使用,如下所示
    2013-09-09
  • C++11?lambda(匿名函數(shù))表達(dá)式詳細(xì)介紹

    C++11?lambda(匿名函數(shù))表達(dá)式詳細(xì)介紹

    lambda 表達(dá)式(lambda expression)是一個(gè)匿名函數(shù),C++11中的lambda表達(dá)式用于定義并創(chuàng)建匿名的函數(shù)對(duì)象,以簡(jiǎn)化編程工作,下面這篇文章主要給大家介紹了關(guān)于C++11?lambda(匿名函數(shù))表達(dá)式的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • C++與Lua交互內(nèi)存分配詳解

    C++與Lua交互內(nèi)存分配詳解

    C/C++ 與 Lua 的交互是通過(guò) lua_State 這一句柄進(jìn)行交互,我們常規(guī)的創(chuàng)建都是通過(guò) luaL_newstate 這一輔助函數(shù),這篇文章主要給大家詳細(xì)介紹了C++與Lua交互內(nèi)存分配,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2023-11-11
  • C++ set的使用方法詳解

    C++ set的使用方法詳解

    這篇文章主要介紹了C++ set的使用方法詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握set的使用方法,需要的朋友可以參考下
    2017-10-10
  • 最新評(píng)論

    新蔡县| 鄂伦春自治旗| 正蓝旗| 连南| 平乐县| 阳泉市| 峡江县| 临泽县| 布尔津县| 五河县| 静安区| 文成县| 义乌市| 藁城市| 凭祥市| 清原| 壤塘县| 三江| 宁河县| 化隆| 泗水县| 湖南省| 镇江市| 六枝特区| 旅游| 剑川县| 鸡泽县| 拜城县| 抚顺县| 嘉祥县| 柏乡县| 深州市| 琼结县| 清水县| 时尚| 平乡县| 马关县| 理塘县| 汶上县| 镇安县| 会昌县|