Discussion:
[問題] 回傳local變數
(时间太久无法回复)
2006-11-17 11:19:54 UTC
Permalink
int [][] tran()
{

int [][]new1=new int [colSize][rowSize];

for(int i=0;i<rowSize;++i)
for(int j=0;j<colSize;++j)
new1[j][i]=array[i][j];


return new1;
}

我在class的method寫一個轉置矩陣

最後回傳的是tran內宣告的new1二維

但是在main印出new1卻有值...

難道說離開function值沒有被馬上清掉?



不知道java在處理local變數怎麼處理


--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.221.120.127
2006-11-17 20:52:42 UTC
Permalink
※ 引述《PsMonkey (痞子軍團團長)》之銘言:
: ==站內信件==
: ※ 引述《justinC (無)》之銘言:
: : int [][] tran()
: : {
: : int [][]new1=new int [colSize][rowSize];
: : for(int i=0;i<rowSize;++i)
: : for(int j=0;j<colSize;++j)
: : new1[j][i]=array[i][j];
: : return new1;
: : }
: : 我在class的method寫一個轉置矩陣
: : 最後回傳的是tran內宣告的new1二維
: : 但是在main印出new1卻有值...
: : 難道說離開function值沒有被馬上清掉?
: : 不知道java在處理local變數怎麼處理
: 抱歉,我完全看不懂你的問題
: 麻煩請修飾你的語句,使其順暢一點
: 並且讓問題描述的清楚一點
: 理論上 new1 這個變數的 scope 只有在 tran() 這個 method 當中
: 如果你在另外一個叫用 tran() 的 method 當中使用 new1
: 應該在 compile 階段就會錯誤
假設我寫的print()來印出陣列

於是print(object.tran());

這樣是可以有值得

我想問的是

new1的scope只在tran()內

當他回傳後應該會被清除阿?

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.221.120.127
godfat 真常
2006-11-17 23:17:46 UTC
Permalink
※ 引述《justinC (無)》之銘言:
: int [][] tran()
: {
: int [][]new1=new int [colSize][rowSize];
^^^^^^^^ ^^^^^^^
陣列又是 new, 就算在 C/C++ 中也不可能會清除內容的
會被清除的只有建立在 stack 中的資料
new1 會被清除,new1 的內容可不會,兩者不可混為一談

: for(int i=0;i<rowSize;++i)
: for(int j=0;j<colSize;++j)
: new1[j][i]=array[i][j];
: return new1;
: }
: 我在class的method寫一個轉置矩陣
: 最後回傳的是tran內宣告的new1二維
: 但是在main印出new1卻有值...
: 難道說離開function值沒有被馬上清掉?
: 不知道java在處理local變數怎麼處理

local variable 永遠會被清掉,不然怎麼叫 local?
你在 Java 中可沒辦法寫:return &new1; 啊
根本不可能抓到被清除的內容

我想你需要釐清動態記憶體配置的相關觀念

--
By Gamers, For Gamers - from the past Interplay

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.228.87.125
痞子軍團團長
2006-11-17 23:26:47 UTC
Permalink
※ 引述《godfat (godfat 真常)》之銘言:
: ※ 引述《justinC (無)》之銘言:
: : int [][] tran()
: : {
: : int [][]new1=new int [colSize][rowSize];
: ^^^^^^^^ ^^^^^^^
: 陣列又是 new, 就算在 C/C++ 中也不可能會清除內容的
: 會被清除的只有建立在 stack 中的資料
: new1 會被清除,new1 的內容可不會,兩者不可混為一談

ㄟ... 等等...
如果下頭沒有要求 return new1
new1 的內容還是遲早會被清除的吧...

熊熊看上面這段,好像只要 new 出來的都會永垂不朽這樣

: : for(int i=0;i<rowSize;++i)
: : for(int j=0;j<colSize;++j)
: : new1[j][i]=array[i][j];
: : return new1;
: : }

--
 侃侃長論鮮窒礙  網站:http://www.psmonkey.idv.tw
 眾目睽睽無心顫  個人版:telnet://legend.twbbs.org
 煢居少聊常人事 
 殺頭容易告白難  歡迎參觀 Java 版(@ptt.cc)精華區 \囧/

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.228.199.201
godfat 真常
2006-11-17 23:32:17 UTC
Permalink
※ 引述《PsMonkey (痞子軍團團長)》之銘言:
: ※ 引述《godfat (godfat 真常)》之銘言:
: : 陣列又是 new, 就算在 C/C++ 中也不可能會清除內容的
: : 會被清除的只有建立在 stack 中的資料
: : new1 會被清除,new1 的內容可不會,兩者不可混為一談
: ㄟ... 等等...
: 如果下頭沒有要求 return new1
: new1 的內容還是遲早會被清除的吧...
: 熊熊看上面這段,好像只要 new 出來的都會永垂不朽這樣

因為原 po 的問題看起來跟 gc 無關,所以這裡就先撇開不談了
話說回來,不知道有沒有可能在記憶體不缺的情況下,
gc 留下一堆垃圾等著在程式結束時才清除?沒看過相關資料

--
By Gamers, For Gamers - from the past Interplay

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.228.87.125
2006-11-18 07:51:38 UTC
Permalink
※ 引述《godfat (godfat 真常)》之銘言:
: ※ 引述《justinC (無)》之銘言:
: ^^^^^^^^ ^^^^^^^
: 陣列又是 new, 就算在 C/C++ 中也不可能會清除內容的
: 會被清除的只有建立在 stack 中的資料
: new1 會被清除,new1 的內容可不會,兩者不可混為一談
原來如此。一時沒察覺是用new~

有gc真方便..

不知道life time的問題...gc會決定.....?我亂猜的...
: local variable 永遠會被清掉,不然怎麼叫 local?
: 你在 Java 中可沒辦法寫:return &new1; 啊
: 根本不可能抓到被清除的內容
: 我想你需要釐清動態記憶體配置的相關觀念
不知道java回傳陣列是怎麼處理

是只會回傳referencec還是會自動會將陣列copy一份過去

對java不熟...臨時要寫才發現java處理機制不瞭的一堆

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.221.120.127
※ 編輯: justinC 來自: 61.221.120.127 (11/18 23:51)
Alien
2006-11-21 22:57:46 UTC
Permalink
※ 引述《justinC (無)》之銘言:
: ※ 引述《godfat (godfat 真常)》之銘言:
: : ^^^^^^^^ ^^^^^^^
: : 陣列又是 new, 就算在 C/C++ 中也不可能會清除內容的
: : 會被清除的只有建立在 stack 中的資料
: : new1 會被清除,new1 的內容可不會,兩者不可混為一談
: 原來如此。一時沒察覺是用new~
: 有gc真方便..
: 不知道life time的問題...gc會決定.....?我亂猜的...
: : local variable 永遠會被清掉,不然怎麼叫 local?
: : 你在 Java 中可沒辦法寫:return &new1; 啊
: : 根本不可能抓到被清除的內容
: : 我想你需要釐清動態記憶體配置的相關觀念
: 不知道java回傳陣列是怎麼處理
: 是只會回傳referencec還是會自動會將陣列copy一份過去
: 對java不熟...臨時要寫才發現java處理機制不瞭的一堆

這方面, 把 java 的 reference-type variable
(非 primitive type) 想成是 pointer 就好了

簡化一點:

class TwoDimensionArray {
..
}

....
TwoDimensionArray* tran() {
TwoDimensionArray* myArray = new TwoDimensionArray(x,y);
//...

return myArray;
}


除了不用再理會 delete 的時機, 其實情況就和上
面的 psuedo-C++ code 差不多

Alien

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.72.0.45

继续阅读narkive:
Loading...