sgi的内存泄露
在linux下試用一個(gè)內(nèi)存檢測(cè)工具?valgrind
比我之前一直在用的wIndows下的內(nèi)存檢測(cè)lvd要好用多了
valgrind --tool=memcheck --show-reachable=yes --leak-check=yes ./tt
./tt 是要檢測(cè)的程序
按照網(wǎng)友的例子:
?
int main() {vector<int> v;v.push_back(100);v.push_back(200);return 0; }用valgrind會(huì)有內(nèi)存泄露,其實(shí)也是可以理解的,按照sgi的實(shí)現(xiàn),就等于申請(qǐng)了一個(gè)8byte的內(nèi)存塊,由于v是局部變量,所以在程序的結(jié)束時(shí)會(huì)調(diào)用其析構(gòu)函數(shù),就應(yīng)該把這個(gè)內(nèi)存塊還給sgi的內(nèi)存管理freelist。要注意,并沒(méi)有釋放freelist中內(nèi)存的操作,所以這塊內(nèi)存等于沒(méi)有釋放。但是現(xiàn)在操作系統(tǒng)會(huì)在程序結(jié)束時(shí)釋放程序所占有的內(nèi)存,所以這里的內(nèi)存泄露也只是still reachable的內(nèi)存,不是definitely lost.可以說(shuō)不算內(nèi)存泄露。對(duì)于
int main() {int *pi; // use local pointer: real memory leak!!!pi = new int[100];return 0; }
就是definitely lost,因?yàn)閜i是局部變量。sgi的freelist是static,其就類(lèi)似于下面的代碼
nt main() {static int *pi; // use static pointer: not a real memory leak!!!pi = new int;return 0; }
這是still reachable的,因?yàn)閜i是靜態(tài)的,全局的
但是,我在linux下的實(shí)驗(yàn),就是本問(wèn)的第一段代碼,vector,valgrind沒(méi)有顯示任何的內(nèi)存泄露。而我自己按照sgi實(shí)現(xiàn)的vector卻有still reachable的內(nèi)存泄露。still reachable表明內(nèi)存還是能找到并釋放的,因?yàn)槲铱梢酝ㄟ^(guò)freelist釋放全部的內(nèi)存,就可以了。
由此可以推斷現(xiàn)在用的g++ 4.1.2用的可能不是sgi的stl,或者不是侯捷所用到的sgi。
如果想用到除了標(biāo)準(zhǔn)stl的sgi容器,比如slist或者h(yuǎn)ash_map,可以這樣用
#include <ext/slist> #include <iostream> #include <algorithm> using namespace std; using namespace __gnu_cxx;
在目錄?/usr/include/c++/4.1.2/ext/
總結(jié)
- 上一篇: sgi 之vector
- 下一篇: 单链表之快排