亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 17480 | 回復: 17
打印 上一主題 下一主題

[C++] 為什么不能返回函數(shù)內(nèi)部new分配的內(nèi)存的引用? [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-10-15 17:28 |只看該作者 |倒序瀏覽
按照這句話,
string& foo()
{
        string* str = new string("abc");
        return *str;
}
非法的,為什么?

論壇徽章:
0
2 [報告]
發(fā)表于 2009-10-15 17:35 |只看該作者
主觀臆斷了,這里刪掉了,看后面回復
http://bbs3.chinaunix.net/viewth ... ;page=1#pid11353088

[ 本帖最后由 net_robber 于 2009-10-16 12:19 編輯 ]

論壇徽章:
0
3 [報告]
發(fā)表于 2009-10-15 19:28 |只看該作者
局部變量

bool foo(string*& strPoint)
{
        string* str = new string("abc");
        return str ? strPoint = str, true : false;
}

論壇徽章:
0
4 [報告]
發(fā)表于 2009-10-15 23:13 |只看該作者

回復 #1 user2003 的帖子

什么叫做非法?

這段代碼編譯沒問題,運行沒問題,有問題的地方是會內(nèi)存泄露

論壇徽章:
0
5 [報告]
發(fā)表于 2009-10-16 08:58 |只看該作者
struct a_s
{
    int a;
};

a_s* foo()
{
     struct a_s* sp = new struct a_s;
     return sp;
}

這個挺好啊,為什么換成reference就泄漏了?

論壇徽章:
0
6 [報告]
發(fā)表于 2009-10-16 09:02 |只看該作者

回復 #5 user2003 的帖子

沒有delete撒

論壇徽章:
0
7 [報告]
發(fā)表于 2009-10-16 09:28 |只看該作者
delete &reference,不過這樣寫很詭異

論壇徽章:
0
8 [報告]
發(fā)表于 2009-10-16 11:09 |只看該作者
你要搞清楚的是返回對象的引用和直接返回對象的區(qū)別,返回引用意味著你是直接返回對象本身,而直接返回對象是復制對象,那么你的第一個代碼
string& foo()
{
    string* str = new string("abc");
    return *str;
}

里面返回的是一個局部變量*str,這個肯定是錯誤的,你的局部對象在函數(shù)返回就被銷毀了,把他返回有何意義?(謝謝9樓的提醒,我這里說錯了,*str并未被銷毀,但是他仍然只是一個值,11樓我做了說明)至于你提到的第二份代碼
struct a_s
{
    int a;
};

a_s* foo()
{
     struct a_s* sp = new struct a_s;
     return sp;
}

你返回的是什么,一個地址,這個地址雖說也是局部變量,但是由于你是用new申請的堆變量,除非你手動釋放,這塊內(nèi)存是不會釋放的(理論上),于是你很幸運,這個指針在程序運行期間一直能引用到正確的內(nèi)存地址,而且更重要的是你返回他,并不是得到返回他本身(說過局部變量的生命期只在函數(shù)執(zhí)行期間).而是該對象的復制,對,一個地址的值而已,所以不會出錯,但是問題就是你的程序后面無法釋放這一塊內(nèi)存,因為delete操作是根據(jù)不同的類型調(diào)用不同的析構(gòu)函數(shù),但是上面的函數(shù)返回時,你就失去了這個局部變量的一切,除開他的內(nèi)存地址.
再說說內(nèi)存泄漏的問題,我們new了一塊內(nèi)存,然后用delete釋放他,這是C++對程序員的要求,但是實際上對現(xiàn)代操作系統(tǒng),垃圾回收機制使得在程序結(jié)束時系統(tǒng)會幫你釋放其占用的控件,可以說上面的new了沒釋放并非語法上的錯誤,而是編程習慣的隱患。
另外說一點,樓主去看看C++Primer,哪些情況下才引用類型的返回值
簡單說下
string & shorterString(string &s1,string &s2)
{
return s1.size()<s2.size()? s1:s2; //返回

//的是s1,或者s2.是你傳遞引用類型形參.

//看了下面的兩個函數(shù)你會發(fā)現(xiàn),傳遞的形參里

//至少有一個是引用. .是用來被返回的.

}
不要返回局部對象的引用.
const string &manip(const string&s)
{
    string ret=s;
    return ret;// 錯誤,ret為局部對象.

}

引用返回左值.(這個是和返回類對象的一個很大的區(qū)別)
char &get_val(string &str,int ix)
{
    return str[ix];
}

int main()
{
    string s("a value");
    cout<<s<<endl;
    get_val(s,0)='A';  // 這里可以用來賦值的,

    cout<<s<<endl;
    return 0;
}



例子摘自C++Primer

[ 本帖最后由 garymb 于 2009-10-16 12:43 編輯 ]

論壇徽章:
0
9 [報告]
發(fā)表于 2009-10-16 11:45 |只看該作者

回復 #8 garymb 的帖子

不要誤導
[quota]
里面返回的是一個局部變量*str,這個肯定是錯誤的,你的局部對象在函數(shù)返回就被銷毀了,把他返回有何意義?至于你提到的
[/quota]

str是局部變量,但*str不是局部變量,是實實在在new出來的,函數(shù)返回時str會銷毀,但*str是不會銷毀的。

論壇徽章:
0
10 [報告]
發(fā)表于 2009-10-16 12:19 |只看該作者
  1. # cat t.cpp
復制代碼

#include <iostream>
#include <string>
using namespace std;

string& foo()
{
        string* str = new string("abc");
        return *str;
}
int main()
{
        string& a=foo();
        cout<<a;
}

  1. # g++ t.cpp
  2. # ./a.out
  3. abc#
復制代碼

[ 本帖最后由 net_robber 于 2009-10-16 12:22 編輯 ]
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP