2017-11-07 6 views
-1

메모리를 목록에 할당하는 방법은 무엇입니까? 다음 코드에서는 목록을 지우고 포인터를 목록에 삭제 한 후에도 메모리를 해제하지 않습니다. 시스템 모니터에서 프로그램이 가져온 메모리를 볼 수 있습니다. 목록에 할당 된 메모리를 효율적으로 삭제할 수 있습니까?목록에 할당 된 메모리를 해제하는 방법은 무엇입니까?

struct Plot 
{ 
    int BUFFER[65535]; 
    int BUFFER1[65535]; 
    int BUFFER2[65535]; 
    int BUFFER3[65535]; 
    int BUFFER4[65535]; 
}; 
int main(int argc, char *argv[]) 
{ 

    std::list<Plot> *LIST= new std::list<Plot>(); 


    Plot PLOT; 
int i=0; 
while(i<1500) 
{ 

    (LIST)->push_back(PLOT); 
    i++; 
    usleep(100); 
} 


LIST->clear(); 

delete LIST; 

while(1) 
{ 
    usleep(100); 
} 
} 
+4

할당 된 메모리가 올바르게 해제되고 누출이 없습니다. C++ 라이브러리의 내부가 많은 것을 숨기기 때문에 시스템 모니터에 의존 할 수 없습니다. 예를 들어 해제 된 메모리가 시스템에 즉시 반환되지 않을 수도 있지만 라이브러리는 자신의 사용 가능한 메모리 풀에 넣을 수 있습니다. 시스템에서 직접 메모리를 요청하는 대신 해당 풀에서 후속 할당을 수행하십시오. 완전히 구현에 의존합니다. –

+0

메모리 관리가 까다로운 경우 사용자 지정 할당 기 사용을 고려하십시오. –

+0

이것은 샘플 코드 일뿐입니다. 메모리가 무한대로 증가하는 비슷한 코드를 사용했습니다. Valgring은 새로운 연산자에서 메모리 누수도 표시합니다. –

답변

1

이 약간 수정 된 프로그램은 내 Windows 컴퓨터에서 실행됩니다.

플랫폼에서이 문제를 해결하고 현재 상황을 확인하십시오.

(면책 조항 :.이 그냥 OP의 코드에 충실하기 위해, 끔찍한 코드)

#include <list> 
#include <windows.h> 

struct Plot 
{ 
    int BUFFER[65535]; 
    int BUFFER1[65535]; 
    int BUFFER2[65535]; 
    int BUFFER3[65535]; 
    int BUFFER4[65535]; 
}; 

int main(int argc, char *argv[]) 
{ 
    int i = 0; 

    while (1) 
    { 
    printf("Iteration %d\n", i++); 

    std::list<Plot> *LIST = new std::list<Plot>(); 

    static Plot PLOT; 
    int i = 0; 
    while (i < 1500) 
    { 
     (LIST)->push_back(PLOT); 
     i++; 
    } 

    LIST->clear(); 
    delete LIST; 

    Sleep(100); 
    } 
} 

그리고이 시스템의 모니터 나 표시하는 시간 대 메모리 사용량입니다 (한 부문은 1.6 기가입니다 .) :

enter image description here

그리고 이것이 내가 대신 디버그 모드를 릴리스 모드에서 컴파일 같은 프로그램을 실행하면 시스템 모니터가 나를 보여줍니다 무엇인가, 그것은 완전히 다른의 메모리 할당의 내부 구현은 총 때문에 릴리스 모드에서 사라져 다른 :

enter image description here

그러나 우리가 볼 수 있듯이, 메모리가 제대로 두 버전에서 해제되고 프로그램이 백그라운드에서 계속 실행됩니다.