koom6   2년 전

안녕하세요. C++로 문제풀이를 시작해보니 아주 기본적인 것에 대한 궁금증이 생겨 질문 올려봅니다.

제가 C에서 변수에 메모리를 동적할당했을때, 해제하지 않은채 주소를 잃어버리면 메모리 누수가 발생했었습니다. 예를 들어 다음과 같은 코드에서 누수가 발생했습니다.

int main()
{
    int n = 3;
    while (n--)
    {
        char *a = (char *)malloc(3);
        // free(a); // 해제를 안해주면 누수 발생
    }
}

그런데 C++의 STL 객체는 int, char 등의 자료형처럼 누수가 발생하지 않는 것 같습니다. (소스 코드의 17번째 줄) 컴퓨터과학 지식이 없어 이 부분이 헷갈리는데요. STL 객체에서도 내부에서는 동적할당이 이루어지는 것으로 알고있는데, 소멸자라는 것이 호출되며 메모리가 적절히 해제돼서 그런건가요? 그렇다면 소멸자가 호출되는 타이밍은 언제인건가요? 그리고 코딩테스트에서 메모리누수가 발생하면 어떻게 되는지도 궁금합니다.

너무 기본적이고 뜬금없는 질문 죄송합니다 ㅠㅠ

bupjae   2년 전

18번째 줄에서 선언한 lst 는 scope 에서 벗어나는 44번째 줄에서 자동으로 소멸자가 호출됩니다. (automatic storage duration)

std::list 는 자신이 필요한 메모리를 스스로 할당하며, 소멸자에서는 자신이 할당받았던 메모리를 모두 반납합니다.

  

43번째 줄의 clear() 메소드는 lst 안의 내용물을 비운다는 뜻인데, 이 프로그램에서는 어차피 44번째 줄에서 호출될 소멸자에서 모두 정리하기 때문에, 굳이 clear() 를 따로 호출할 필요는 없습니다.

   

BOJ 같은 채점 시스템에 제출한 프로그램에 메모리 누수가 있다면, 결과는 예측하기 힘듭니다.

경험적으로, 입력 파일 하나에 테스트 케이스가 여러 개 있는 문제일 경우에서 "메모리 초과" 결과를 받을 가능성이 커지는 것으로 보입니다.

   

20번째 줄의 레퍼런스는 container 에서 element 를 뽑아올 때, 값을 복사하지 않고 주소만 들고 오겠다는 뜻입니다.

하지만, 이 프로그램에서는 들고 올 대상이 char (1 byte) 이므로, 굳이 주소를 들고 올 이유가 없습니다.

koom6   2년 전

댓글을 보고 궁금했던 부분들이 해결됐습니다. 감사합니다!

댓글을 작성하려면 로그인해야 합니다.