作者jerrykk (路邊小人物)
看板C_and_CPP
標題[問題] 全域動態陣列 釋放問題
時間Thu Aug 13 17:00:37 2009
請問我有靜態陣列改為一個動態陣列宣告為全域 (程式需要 一定要全域)
但是他的配置是在寫在aaa()裡面
所以我也把它的記憶體釋放擺在aaa()最後面
因為我的程式是用命令列跑大量次數
但是自從我把這個陣列從原本靜態改為動態後
自動跑到第三次就會出現當機 (如果手動單跑一次都不會)
我的配置如下
------main.cpp 中---------------------
main
{
for(i=0;i<100;i++) //要跑很多次
aaa(s);
}
--------AAA.cpp 中---------------------
Prev_info ***Shortest=new Prev_info**[2200]; //全域宣告
int aaa(int s)
{
int f1,f2;
for( f1=0;f1<2200;f1++)
{
Shortest[f1]=new Prev_info*[30];
}
for( f1=0;f1<2200;f1++)
{ for( f2=0;f2<30;f2++)
{ Shortest[f1][f2]=new Prev_info[500]; //配置
}
}
有一段程式給全部初始值0
.....
.....
.....
.....
int xx,yy;
for(xx=0;xx<2200;xx++)
{
for( yy=0;yy<30;yy++)
{
delete [] Shortest[xx][yy]; //釋放
}
delete [] Shortest[xx];
} delete [] Shortest;
}
----------------------------------------------------------
我原本想說反正整個程式還沒結束,就先不要釋放,反正每次進aaa我都會再給初始值
不怕數值錯誤,可是就算拿掉delete那段
也是會在跑到兩三次的時候當機
我懷疑是配置全域造成釋放有問題,可是卻能正常跑過二次
覺得很奇怪 目前也想不出問題出在哪裡
謝謝幫忙看完
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.228.179.7
1F:→ weiyucsie:最後有需要delete[] Shortest嗎? 08/13 17:21
2F:→ jerrykk:我有拿掉那段過還是一樣 還是說配置也只能一次? 08/13 17:35
3F:推 QQ29:當掉資訊 有辦法貼一下嘛 08/13 18:09
4F:推 QQ29:我大概知道你為啥會盪 你***那邊只initial一次 你delete掉 08/13 18:14
5F:→ QQ29:進去aaa也沒再對他new一次了 所以就有可能觸發一些run time 08/13 18:15
6F:→ QQ29:error 08/13 18:15
7F:→ QQ29:hortest=new Prev_info**[2200];寫到aaa裡面吧 08/13 18:16
8F:→ jerrykk:恩 多謝 應該是這原因 不過我現在把下面配置只有第一次跑 08/13 18:18
9F:→ jerrykk:也可以用了 也是說我現在只配置第一次就好了 08/13 18:18
10F:→ jerrykk:然後delete拿掉 最後跑完再做就好 08/13 18:20
11F:推 QQ29:是你 2樓推文那樣嘛? 還有當掉嘛? 08/13 18:29
12F:→ QQ29:不過我比較好奇 為啥不要全部for跑完再一次清 這樣overhead 08/13 18:29
13F:→ QQ29:小很多吧 08/13 18:29
14F:→ jerrykk:恩 我已經改成最後才清了 感謝 08/13 18:34