template<class DataType>
ALGraph<DataType>::~ALGraph()
{
for(int i=0;i<vertexNum;i++)
{
ArcNode *p=adjlist[i].firstedge;
ArcNode *pp;
while(NULL!=p)
{
pp=p->next;
delete p;
p=pp;
}
}
cout<<"delete"<<endl;
}
void main()
{
int a[]={0,1,2,3,4,5};
ALGraph<int> *g=new ALGraph<int>(a,5,5);
}
關鍵代碼如上,沒有執行解構式,難道這部分記憶體就泄漏了嗎?
uj5u.com熱心網友回復:
記憶體是泄露了,但同時行程的結束回收了記憶體。記憶體泄漏的問題是你在運行程序中不停的有申請記憶體,長時間運行后導致記憶體不足導致奔潰。
就一塊記憶體,沒有變化,并不影響長期運行,只是系統少了這么點而已。
uj5u.com熱心網友回復:
既然回收了記憶體為什么沒呼叫解構式?
uj5u.com熱心網友回復:
ALGraph<int> *g=new ALGraph<int>(a,5,5);
使用new申請的記憶體系統是不會主動回收的,需要手動洗掉,不然會造成記憶體泄露
uj5u.com熱心網友回復:
那程式結束后那塊泄漏的記憶體還是沒有被回收?
uj5u.com熱心網友回復:
template<class DataType>
ALGraph<DataType>::~ALGraph()
{
for(int i=0;i<vertexNum;i++)
{
ArcNode *p=adjlist[i].firstedge;
ArcNode *pp;
while(NULL!=p)
{
pp=p->next;
delete p;
p=pp;
}
}
cout<<"delete"<<endl;
}
void main()
{
int a[]={0,1,2,3,4,5};
ALGraph<int> *g=new ALGraph<int>(a,5,5);
}
關鍵代碼如上,沒有執行解構式,難道這部分記憶體就泄漏了嗎?
ALGraph<int> *g=new ALGraph<int>(a,5,5);
使用new申請的記憶體系統是不會主動回收的,需要手動洗掉,不然會造成記憶體泄露
那程式結束后那塊泄漏的記憶體還是沒有被回收?
沒有
uj5u.com熱心網友回復:
template<class DataType>
ALGraph<DataType>::~ALGraph()
{
for(int i=0;i<vertexNum;i++)
{
ArcNode *p=adjlist[i].firstedge;
ArcNode *pp;
while(NULL!=p)
{
pp=p->next;
delete p;
p=pp;
}
}
cout<<"delete"<<endl;
}
void main()
{
int a[]={0,1,2,3,4,5};
ALGraph<int> *g=new ALGraph<int>(a,5,5);
}
關鍵代碼如上,沒有執行解構式,難道這部分記憶體就泄漏了嗎?
ALGraph<int> *g=new ALGraph<int>(a,5,5);
使用new申請的記憶體系統是不會主動回收的,需要手動洗掉,不然會造成記憶體泄露
那程式結束后那塊泄漏的記憶體還是沒有被回收?
作業系統會幫你回收這塊記憶體
uj5u.com熱心網友回復:
到底有沒有。。。
uj5u.com熱心網友回復:
ALGraph<int> *g=new ALGraph<int>(a,5,5);g沒有delete肯定泄漏
uj5u.com熱心網友回復:
ALGraph<int> *g=new ALGraph<int>(a,5,5);
g沒有delete肯定泄漏
百度百科上說
記憶體泄漏也稱作“存盤滲漏”,用動態存盤分配函式動態開辟的空間,在使用完畢后未釋放,結果導致一直占據該記憶體單元。直到程式結束。
程式結束了記憶體單元不被占據了,也就是被釋放了嗎?
uj5u.com熱心網友回復:
ALGraph<int> *g=new ALGraph<int>(a,5,5);
g沒有delete肯定泄漏
百度百科上說
記憶體泄漏也稱作“存盤滲漏”,用動態存盤分配函式動態開辟的空間,在使用完畢后未釋放,結果導致一直占據該記憶體單元。直到程式結束。
程式結束了記憶體單元不被占據了,也就是被釋放了嗎?
確實如此,你的這種簡單的應用似乎沒什么大的危害,但是實際的程式會不斷的申請記憶體釋放記憶體,申請后如果沒有釋放不久系統就會崩潰
uj5u.com熱心網友回復:
行程退出或回收說有的記憶體,但程式還在運行的時候你必須呼叫delete來回收,否則不停的new,行程占用記憶體會不停增加。uj5u.com熱心網友回復:
行程退出的回收是系統級的。和析構沒有關系。uj5u.com熱心網友回復:
嚴格點,只要new和沒有對應的delete就是記憶體泄漏。但不同使用方法產生的危害程度不一樣。例如,如程式一運行就申請了一塊記憶體,該記憶體一直使用,直到程式結束。
那有沒有delete就不影響行程和系統。反正到最后都要回收的,delete回識訓是系統回收都一樣。
如果有一個類類似工廠,不停的生產物件,但沒有用完釋放就會不停的耗掉記憶體。
uj5u.com熱心網友回復:
每個程式出生時都會向國家(作業系統)請一個自己的地盤,不管其中發生了什么情況,程式死了,那土地充公。uj5u.com熱心網友回復:
new 之后, 如果不delete. 那么在行程未結束之前, 這些記憶體就泄漏了, 不系統不能回收它.當行程結束時, 行程所分配的記憶體會被系統回收, 但僅僅是回收記憶體, 系統并不關心你程式里面是如何使用它的,
也就是說, 它并不會像樓主想的那個, 系統回收記憶體的時候, 還會呼叫解構式.
只有程式內部呼叫delete才會呼叫解構式.
delete程序實際是這樣的. (假設delete的是一個物件指標)
首先: 呼叫物件的解構式
然后: 呼叫free類似的記憶體釋放函式, 告訴系統, 這塊記憶體我用完了, 還給你.
在行程結束時應該是這樣: 系統說: 你都死了, 東西全部歸國有.
uj5u.com熱心網友回復:
行程退出了,作業系統會幫你做后續收尾的作業~轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/118177.html
標籤:基礎類
上一篇:MFC畫圖程式,拖動對話框重影
