sgi의 메모리 유출

1634 단어
linux에서 메모리 검사 도구valgrind를 사용해 보십시오
제가 지금까지 사용했던 wIndows의 메모리 검사 lvd보다 훨씬 좋아요.
valgrind --tool=memcheck --show-reachable=yes --leak-check=yes ./tt
./tt는 테스트할 프로그램입니다.
네티즌의 예에 따르면
 
4
int main()
{
    vector<int> v;
    v.push_back(100);
    v.push_back(200);
    return 0;
}
valgrind로 메모리 유출이 있을 수 있지만 사실 이해할 수 있다. sgi의 실현에 따라 8byte의 메모리 블록을 신청한 것과 같다. v는 국부 변수이기 때문에 프로그램이 끝날 때 그 분석 함수를 호출할 수 있다. 이 메모리 블록을 sgi의 메모리 관리freelist에 돌려주어야 한다.freelist의 메모리를 방출하지 않았기 때문에 이 메모리는 방출되지 않은 것과 같습니다.그러나 현재 운영체제는 프로그램이 끝날 때 프로그램이 차지하는 메모리를 방출하기 때문에 이곳의 메모리 유출은 still reachable의 메모리일 뿐 definitely lost가 아니다.메모리 유출은 아니라고 할 수 있다.
대상
int main()
{
    int *pi;  // use local pointer: real memory leak!!!
    pi = new int[100];
    return 0;
}

pi는 국부 변수이기 때문에 definitely lost입니다.sgi의freelist는static입니다. 아래 코드와 유사합니다
nt main()
{
    static int *pi;  // use static pointer: not a real memory leak!!!
    pi = new int;
    return 0;
}

이것은 still reachable입니다. 왜냐하면 pi는 정적, 전역적이기 때문입니다
그러나, 내가 linux에서 실험한 것은 바로 이 질문의 첫 번째 코드인,vector,valgrind가 메모리 유출을 표시하지 않았다는 것이다.내가 sgi에 따라 구현한 벡터는 스틸 리처블의 메모리가 유출되었다.still reachable는 메모리를 찾을 수 있고 방출할 수 있음을 나타냅니다.freelist를 통해 모든 메모리를 방출할 수 있기 때문입니다.
이로써 현재 사용되고 있는 g++4.1.2는 sgi의 stl이 아닐 수도 있고 후첩이 사용한 sgi가 아닐 수도 있다.
표준 stl을 제외한 sgi 용기, 예를 들어slist나hash맵
#include <ext/slist>
#include <iostream>
#include <algorithm>
using namespace std;
using namespace __gnu_cxx;

디렉토리/usr/include/c++/4.1.2/ext/

좋은 웹페이지 즐겨찾기