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