欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

lz是這樣問的:

按照這句話,

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

非法的,為什么?

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

后面還有個回復是這樣的:

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<<"構造"<<endl;
}
~example()
{
  cout<<"析構"<<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;
}

運行結果如下:

num = 10
構造
100
析構
num = 10
構造
100
析構

從運行結果來看:我的結論如下:

并不是說返回函數(shù)內(nèi)存new分配的內(nèi)存的引用或指針是非法的,只是說如果要返回,必須要十分注意,因為很有可能造成內(nèi)存泄露。所以一般不提倡返回函數(shù)內(nèi)存new分配的內(nèi)存的引用或指針。

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

相關文章

  • 實現(xiàn)opencv圖像裁剪分屏顯示示例

    實現(xiàn)opencv圖像裁剪分屏顯示示例

    這篇文章主要介紹了實現(xiàn)opencv圖像裁剪分屏顯示示例,需要的朋友可以參考下
    2014-04-04
  • C++內(nèi)存管理詳細解析

    C++內(nèi)存管理詳細解析

    這篇文章主要給大家分享的是C++內(nèi)存管理的詳細內(nèi)容學習,下面文章圍繞C++內(nèi)存管理的相關資料展開具體學習內(nèi)容,需要的朋友可以參考一下,希望對你有所幫助
    2021-11-11
  • 一文弄懂c語言賦值截斷

    一文弄懂c語言賦值截斷

    截斷是指將一個較寬范圍的整型賦值給一個較窄范圍的整型時,超出目標類型表示范圍的部分被丟棄,只保留目標類型能夠表示的部分,本文主要介紹了c語言賦值截斷,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • C語言中bool和float的用法實例解析

    C語言中bool和float的用法實例解析

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

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

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

    談談C++學習之Pair的使用方法

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

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

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

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

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

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

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

    C++ set的使用方法詳解

    這篇文章主要介紹了C++ set的使用方法詳解的相關資料,希望通過本文能幫助到大家,讓大家理解掌握set的使用方法,需要的朋友可以參考下
    2017-10-10

最新評論