程序的靜態(tài)數(shù)據(jù)量大的時(shí)候,有時(shí)候會(huì)出現(xiàn)棧溢出問(wèn)題,往往是程序還沒(méi)運(yùn)行算法呢,就down掉了,比如你在創(chuàng)建包含大數(shù)組的類(或數(shù)據(jù))的時(shí)候,棧就溢出了。這是由于系統(tǒng)分配給程序的棧空間太小。
一種方法,就是不要靜態(tài)分配,用new動(dòng)態(tài)創(chuàng)建,是從堆中分配的,堆的空間足夠大,不過(guò)記得寫析構(gòu)函數(shù),delete你申請(qǐng)的堆空間。其實(shí)這樣也挺方便,類結(jié)束的時(shí)候會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)釋放空間。養(yǎng)成"不在棧上定義大數(shù)組/大對(duì)象"的好習(xí)慣很重要,否則再大的棧也會(huì)被撐爆的。
當(dāng)然,如果你不喜歡new,delete的話,還是靜態(tài)分配(畢竟靜態(tài)分配有很多好處),那么可以通過(guò)改變默認(rèn)棧空間來(lái)解決。
LINK的/STACK選項(xiàng)
/STACK :reserve[,commit]
reserve:棧總大小
commit:程序開始時(shí)系統(tǒng)提供的實(shí)際內(nèi)存量
缺省:1M,8K
參數(shù)為0取缺省值
今天在VC++.NET中運(yùn)行聚類程序,老是說(shuō)Stack OverFlow, 后來(lái)才發(fā)現(xiàn)是棧空間太小了。
單單保存100個(gè)網(wǎng)頁(yè)的數(shù)據(jù)量就比較大了。
把堆棧的大小已經(jīng)設(shè)置為:
堆棧保留大小為:100000000;
堆棧提交大小為: 100000000;
就沒(méi)問(wèn)題了。
設(shè)置:項(xiàng)目-> 屬性-> 鏈接器-> system-> 堆棧保留大小/堆棧提交大小