Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

有關new之一問

0 views
Skip to first unread message

煩人ㄉGrayCode

unread,
Apr 26, 2000, 3:00:00 AM4/26/00
to
※ 引述《skyforce (好累喔~)》之銘言:
> 像下面這樣ㄉ程式:
> void test(int *p)
> {
> //delete p;
> p=new int(3);
> }
> void main()
> {
> int *ptr;
> ptr=new int(2);
> test(ptr);
> cout<<*ptr<<endl;
> }
> cout最後會輸出ㄉptr是2,test函式裡面ㄉnew運算子所宣告的新記憶體空間
> 好像也僅止於testㄉScope裡面,出ㄌtest Scope之後,p所指向ㄉ依然是原來所宣告ㄉ2,
> 我該如何才可以在函式裡面使用new去更改傳進來ㄉpointer之記憶體位址????
> 如果將第三行ㄉdelete p;之前ㄉ//去掉
> 如此cout輸出ㄉptr竟然為任意值???
更正,這樣輸出就變成3ㄌ.
那這樣就是把ptr原本ㄉ空間釋放掉之後,再用new重新宣告一個新空間
但是當我再用delete再釋放掉p,輸出卻依然是3???
(在test裡面用delete也就是像下面這樣:
void tesT(int *p)
{
delete p;//先把外部存放2ㄉ空間釋放
p=new int(3);//宣告新空間,放3
delete p;//釋放p指向ㄉ記憶體 ,存放3.
}
照理講,p應該會變成空指標..但是..印出來竟然是3??!?!?
挖勒...
> 難道newㄉ權力沒有delete來ㄉ大嘛???
> 在test Scope裡面new所宣告ㄉ新空間只允許在test裡面使用,離開後即歸還
> 那個delete所刪除ㄉp所指向ㄉ空間應該也是在test Scope裡啊
> 為什麼delete可以影響到外面,new不行??
--
[1;32m※ Origin: [33m雲淡風清 [37m<bbs.au.edu.tw> [m
[1;31m◆ From: [36m210.60.11.38 [m

ZZzzz....

unread,
Apr 27, 2000, 3:00:00 AM4/27/00
to
※ 引述《skyfor...@bbs.au.edu.tw (煩人ㄉGrayCode)》之銘言:
: ※ 引述《skyforce (好累喔~)》之銘言:

: > 像下面這樣ㄉ程式:
: > void test(int *p)
: > {
: > //delete p;
: > p=new int(3);
: > }
: > void main()
: > {
: > int *ptr;
: > ptr=new int(2);
: > test(ptr);
: > cout<<*ptr<<endl;
: > }
: 更正,這樣輸出就變成3ㄌ.

: 那這樣就是把ptr原本ㄉ空間釋放掉之後,再用new重新宣告一個新空間
: 但是當我再用delete再釋放掉p,輸出卻依然是3???
: (在test裡面用delete也就是像下面這樣:
: void tesT(int *p)
: {
: delete p;//先把外部存放2ㄉ空間釋放
: p=new int(3);//宣告新空間,放3
: delete p;//釋放p指向ㄉ記憶體 ,存放3.
: }
: 照理講,p應該會變成空指標..但是..印出來竟然是3??!?!?
: 挖勒...
delete 之後, p "不會"被清成空指標...
也就是說 p 仍然指向原來的位置.... (所謂的 dangling pointer)
當然會印出3
像這種用法, 很容易造成 core dump
: > 難道newㄉ權力沒有delete來ㄉ大嘛???

: > 在test Scope裡面new所宣告ㄉ新空間只允許在test裡面使用,離開後即歸還
: > 那個delete所刪除ㄉp所指向ㄉ空間應該也是在test Scope裡啊
: > 為什麼delete可以影響到外面,new不行??
看來你對指標的概念還是沒搞懂.....:P
--
我好弱,
我好弱,
我好弱弱弱弱弱....

--
[0;31m ╭╮
[1;31m╭═╮ │ ╭═╮ [34m ◆星際個體: [1;33;41m未來 [32;44m最舊 [33;40m小棧 [0m [0m《 [1;36mO [30mldest [31mf [30muture [37mO [1;30mbject [0m》
[0;32m│ │ ┼ │ │ [1;34m ◆通訊頻率: [0;32m -=Ξ [1;36mO [31mf [37mO [33m.twbbs.org [0;32m Ξ=-
[1;32m╰═╯ │ ╰═╯ [34m ◆來源座標: [0;35m mousep.Dorm9.NCTU.edu.tw [0m
[0;36m│ [0m
[1;34m╯ [0m


寫程式賺錢當中~

unread,
Apr 27, 2000, 3:00:00 AM4/27/00
to

※ 引述《mouse...@OfO.twbbs.org (ZZzzz....)》之銘言:
> ※ 引述《skyfor...@bbs.au.edu.tw (煩人ㄉGrayCode)》之銘言:

> : 更正,這樣輸出就變成3ㄌ.
> : 那這樣就是把ptr原本ㄉ空間釋放掉之後,再用new重新宣告一個新空間
> : 但是當我再用delete再釋放掉p,輸出卻依然是3???
> : (在test裡面用delete也就是像下面這樣:
> : void tesT(int *p)
> : {
> : delete p;//先把外部存放2ㄉ空間釋放
> : p=new int(3);//宣告新空間,放3
> : delete p;//釋放p指向ㄉ記憶體 ,存放3.
> : }
> : 照理講,p應該會變成空指標..但是..印出來竟然是3??!?!?
> : 挖勒...
> delete 之後, p "不會"被清成空指標...
sorry.偶記錯ㄌ咩
那麼..p所指向ㄉ空間會被釋放掉吧
所指向ㄉ空間就被自由記憶體可以再度使用
但是你還是沒有回答我ㄉ問題啊...你只是挑ㄌ我錯而已..~
在函式裡面ㄉnew難道影響不到傳進來ㄉ指標嗎??
這該怎麼解釋呢??
我現在由於需要動態改變這個指標所指向ㄉ空間大小
(一個雙重指標,這裡只是我把他縮水po出來ㄉ)
如果函式裡面ㄉnew沒辦法影響到指標
那我幾乎沒有辦法去動到傳遞進來ㄉ指標
除非我把他宣告成GlobeVariable....
但是這樣ㄉ話整個程式看起來就很不乾淨ㄌ><

> 也就是說 p 仍然指向原來的位置.... (所謂的 dangling pointer)
> 當然會印出3
> 像這種用法, 很容易造成 core dump

> 看來你對指標的概念還是沒搞懂.....:P

ZZzzz....

unread,
Apr 27, 2000, 3:00:00 AM4/27/00
to
※ 引述《skyfor...@bbs.au.edu.tw (寫程式賺錢當中~)》之銘言:
: ※ 引述《mouse...@OfO.twbbs.org (ZZzzz....)》之銘言:
: 在函式裡面ㄉnew難道影響不到傳進來ㄉ指標嗎??
: 這該怎麼解釋呢??
當然不會, 除非你用傳參考(pass by reference)
不然傳進來的指標只是原來指標的一個複製品而已...
就算你在程式中去改到, 也不會影響原來的值....
所謂的傳參考就像
void test (int *&p)
{ /*...*/}
這樣...
: 我現在由於需要動態改變這個指標所指向ㄉ空間大小

: (一個雙重指標,這裡只是我把他縮水po出來ㄉ)
: 如果函式裡面ㄉnew沒辦法影響到指標
: 那我幾乎沒有辦法去動到傳遞進來ㄉ指標
: 除非我把他宣告成GlobeVariable....
: 但是這樣ㄉ話整個程式看起來就很不乾淨ㄌ><

--
ZZZZZZzzzzzz [0;31;40mZZZZZZzzzzzz [0;32;40mZZZZZZzzzzzz [0;33;40mZZZZZZzzzzzz [0;34;40mZZZZZZzzzzzz [0;35;40mZZZZZZzzzzzz
[0;31;40mZZZZZZzzzzzz [0;32;40mZZZZZZzzzzzz [0;33;40mZZZZZZzzzzzz [0;34;40mZZZZZZzzzzzz [0;35;40mZZZZZZzzzzzz [0;37;40mZZZZZZzzzzzz
[0;32;40mZZZZZZzzzzzz [0;33;40mZZZZZZzzzzzz [0;34;40mZZZZZZzzzzzz [0;35;40mZZZZZZzzzzzz [0;37;40mZZZZZZzzzzzz [0;31;40mZZZZZZzzzzzz
[0;33;40mZZZZZZzzzzzz [0;34;40mZZZZZZzzzzzz [0;35;40mZZZZZZzzzzzz [0;37;40mZZZZZZzzzzzz [0;31;40mZZZZZZzzzzzz [0;32;40mZZZZZZzzzzzz
[0;34;40mZZZZZZzzzzzz [0;35;40mZZZZZZzzzzzz [0;37;40mZZZZZZzzzzzz [0;31;40mZZZZZZzzzzzz [0;32;40mZZZZZZzzzzzz [0;33;40mZZZZZZzzzzzz
[0;35;40mZZZZZZzzzzzz [0;37;40mZZZZZZzzzzzz [0;31;40mZZZZZZzzzzzz [0;32;40mZZZZZZZzzzzz [0;33;40mZZZZZZzzzzzz [0;34;40mZZZZZZzzzzzz
[0;37;40m

--
[0;31m ╭╮
[1;31m╭═╮ │ ╭═╮ [34m ◆星際個體: [1;33;41m未來 [32;44m最舊 [33;40m小棧 [0m [0m《 [1;36mO [30mldest [31mf [30muture [37mO [1;30mbject [0m》
[0;32m│ │ ┼ │ │ [1;34m ◆通訊頻率: [0;32m -=Ξ [1;36mO [31mf [37mO [33m.twbbs.org [0;32m Ξ=-

[1;32m╰═╯ │ ╰═╯ [34m ◆來源座標: [0;35m ccsun15.csie.nctu.edu.tw [0m

0 new messages