亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

在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)存泄露,必須保證對(duì)每個(gè)用new產(chǎn)生的指針調(diào)用delete釋放。

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

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

只能這樣:

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

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

為了證明我的思想,我寫了測(cè)試代碼:(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)存的引用全部?jī)?nèi)容了,希望大家多多支持腳本之家~

相關(guān)文章

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

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

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

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

    這篇文章主要為大家詳細(xì)介紹了C語言中文件相關(guān)函數(shù)的使用,可以實(shí)現(xiàn)文件的讀寫、打開和關(guān)閉。文中通過示例進(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 的交互是通過 lua_State 這一句柄進(jìn)行交互,我們常規(guī)的創(chuàng)建都是通過 luaL_newstate 這一輔助函數(shù),這篇文章主要給大家詳細(xì)介紹了C++與Lua交互內(nèi)存分配,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2023-11-11
  • C++ set的使用方法詳解

    C++ set的使用方法詳解

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