這兩個函數(shù)一個是銷毀棧DestroyStack,一個是清空棧ClearStack
成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比河北網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式河北網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋河北地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。
銷毀是把整個棧都釋放掉,清空只是把棧里元素清除。
因?yàn)槟愕臈T厥莍nt型基本變量,所以棧元素內(nèi)容是直接存放在??臻g的,并沒有另外申請內(nèi)存保存棧元素,所以在從棧里移除棧元素時,不需要調(diào)用free函數(shù)。
實(shí)際上你的DestroyStack可以很直接的如下:
int DestroyStack(stack s)
{
free(s.base); //釋放??臻g,這里假設(shè)s.base是個指針而不是數(shù)組
//如果s結(jié)構(gòu)也是動態(tài)申請的,也需要執(zhí)行free(s);
}
至于ClearStack,書上寫的是沒問題的,清空棧,不是要釋放??臻g,而是把棧里的元素都清除,最直接的做法就是把棧頂指針指向棧底指針,棧頂和棧底指針相同時,就表示棧內(nèi)無元素,??臻g還是保留,下次可以繼續(xù)把棧元素壓棧和彈棧。
當(dāng)用戶離開一個task一段時間后,系統(tǒng)就會清理掉task里出了rootActivity以外的Activity,如果用戶又回來了,顯示的是rootActivity,就像是用戶離開又回來,是放棄以前的東西,開始新的東西。上面說的是默認(rèn)的情況,有一些Activity的屬性可以用來控制和修改這些行為。
alwaysRetainTaskState
如果一個task里的root Activity的alwaysRetainTaskState屬性設(shè)置為true,那么前面描述的默認(rèn)情況就不會出現(xiàn)了,task即使過了一段時間也會一直保留所有的Activity。
clearTaskOnLaunch
如果一個task里的root Activity的clearTaskOnLaunch屬性設(shè)置為true,和alwaysRetainTaskState相反,即使是一瞬間的離開,系 統(tǒng)馬上就會清理掉task里出rootActivity以外的所有Activity。
擴(kuò)展資料
堆棧的作用:
在絕大多數(shù)的平臺上,堆棧主要完成這么四個事情:
1、臨時數(shù)據(jù)存放。
主要通過 push 和 pop 兩個指令完成。這就好比,我們在工作的時候,手邊臨時拿不了的東西,先暫時放在桌子上,等手頭空閑下來了,再移動到該存放的地方。
2、存放函數(shù)局部變量。
3、存放函數(shù)的虛參。
4、記錄調(diào)用軌跡。
稍大的程序一般是一個函數(shù)調(diào)用另一個函數(shù),然后再調(diào)用其他函數(shù)......為了能夠讓函數(shù)執(zhí)行后按照原先的順序返回,堆棧就必須記錄調(diào)用的軌跡。
堆棧要求太高而導(dǎo)致溢出的原因:
1、需要臨時存儲的信息太多了。這種情況多發(fā)生在用內(nèi)部函數(shù)(例如 max 、read、數(shù)組整體賦值 )處理較大量的數(shù)組。這種時候,我們可以用循環(huán)來代替一些內(nèi)部函數(shù),或者用循環(huán)分批次地處理內(nèi)部函數(shù)。
2、函數(shù)局部變量太大。局部變量多數(shù)存儲在堆棧里,當(dāng)它很大是,就容易溢出。尤其針對數(shù)組大小由虛參給定的情況。
你這個棧是一個順序棧,base是其所占內(nèi)存的首地址,當(dāng)然free(s-base)會把整個棧所占內(nèi)存都釋放,棧不僅僅是空了(象杯子中沒有了水),而且變沒了(連杯子都只剩下個底座了)??梢赃@樣做,但是一定注意:對應(yīng)的結(jié)構(gòu)體中stacksize要置為0。