淺談返回函數(shù)內(nèi)部new分配的內(nèi)存的引用
在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)容了,希望大家多多支持腳本之家~
相關文章
stl容器set,map,vector之erase用法與返回值詳細解析
在使用 list、set 或 map遍歷刪除某些元素時可以這樣使用,如下所示2013-09-09C++11?lambda(匿名函數(shù))表達式詳細介紹
lambda 表達式(lambda expression)是一個匿名函數(shù),C++11中的lambda表達式用于定義并創(chuàng)建匿名的函數(shù)對象,以簡化編程工作,下面這篇文章主要給大家介紹了關于C++11?lambda(匿名函數(shù))表達式的相關資料,需要的朋友可以參考下2022-07-07