Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

new/delete의 짝이 맞는 경우에도 메모리 누수가 발생한다면?

PDB 심볼을 다루다보면 ISymUnmanagedMethod 인터페이스의 GetSequencePoints 메서드를 이용해 ISymUnmanagedDocument 배열을 반환받는 과정이 다음과 같이 펼쳐집니다.

netmf /client_v4_2_comm/CLR/Tools/Parser/Support.cpp
; https://searchcode.com/codesearch/view/11140450/

pOffsets  = new ULONG32[cSeqPoints]; // 배열 할당
// ...[생략]...
pDocs     = new ISymUnmanagedDocument*[cSeqPoints]; // 배열 할당

// GetSequencePoints 메서드에서 cSeqPoints 개수만큼 할당된 배열에 내용이 채워짐
TINYCLR_CHECK_HRESULT(pMethod->GetSequencePoints( cSeqPoints, &cSeqPoints, pOffsets, pDocs, pLines, pCols, pEndLines, pEndCols ));

for(ULONG32 i = 0; i < cSeqPoints; i++)
{
    if(i == cSeqPoints || ipOffset < pOffsets[i+1])
    {
        // ...[생략]...
    }
}

// ...[생략해서는 안되는 코드, 그런데 저는 생략했음!]...

delete[] pOffsets; // 배열 할당 해제
// ...[생략]...
delete[] pDocs; // 배열 할당 해제

(위의 코드를 알고 그대로 사용했다면 실수를 안했을 텐데!) 제 나름대로 ISymUnmanagedMethod 인터페이스 사용방법을 터득해 나가다가 저렇게 "...[생략해서는 안되는 코드]..." 영역을 생략해 버리고 작성하게 되는 실수를 했습니다.

그야말로 무심코! 배열 할당을 했으니 그냥 할당된 배열만 짝을 맞춰 해제시키기만 했고 하루 정도의 응용 프로그램 부하 테스트에서 여지없이 Memory Leak이 발생한 것입니다.

사실, 나름대로 완벽하게 new/delete를 맞췄기 때문에 처음에는 '참 희한하다...' 라고 생각했는데. ^^

알고 보니, 배열이 포함한 요소의 타입이 인터페이스인 경우 그것까지도 명백하게 해제를 해야 Memory Leak이 안 났습니다. 즉, "...[생략해서는 안되는 코드]..."가 이렇게 존재해야만 합니다.

if(pDocs)
{
    for(ULONG32 i = 0; i < cSeqPoints; i++)
    {
        if(pDocs[i])
        {
            pDocs[i]->Release();
        }
    }
}

외부에서 얻어온 인터페이스는 철저하게 해제를 해줘야 한다는 상식!... 을 어느새 잊어버린 것입니다. ^^




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 7/10/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 166  167  168  169  170  171  172  173  174  175  176  177  178  [179]  180  ...
NoWriterDateCnt.TitleFile(s)
619정성태11/30/200826496디버깅 기술: 20. 예외 처리를 방해하는 WPF Modal 대화창파일 다운로드1
618정성태11/29/200826947.NET Framework: 113. 이벤트에 속한 이벤트 핸들러 확인파일 다운로드1
617정성태11/26/200834222.NET Framework: 112. How to Interop DISPPARAMS [2]파일 다운로드2
616정성태11/26/200826598디버깅 기술: 19. C++/CLI - F11 디버깅 시의 변수 초기화파일 다운로드1
615정성태11/9/200836057.NET Framework: 111. WPF - Window, UserControl 클래스 상속 [1]
614정성태11/9/200835992.NET Framework: 110. WPF - 전역 예외 처리 [4]파일 다운로드1
613정성태11/8/200825366.NET Framework: 109. WPF - SystemColors 색상표파일 다운로드1
612정성태11/1/200830753.NET Framework: 108. WPF + WCF 환경에서는 DataContract를 권장 [1]
611정성태10/31/200824284오류 유형: 62. WPF - Visual Studio 2008 비정상 종료
610정성태10/24/200827325Team Foundation Server: 26. TFS 2008 SP1 + SQL Server 2008 설치
609정성태10/24/200832621.NET Framework: 107. WPF - RadioButton 데이터 바인딩 해제 현상파일 다운로드2
608정성태10/23/200825669오류 유형: 61. TFS 연결 오류: TF31003, TF30331 오류
607정성태10/18/200824136Windows: 32. 자동 실행 경로에 ".." 가 포함된 경우
606정성태10/18/200826096.NET Framework: 106. WCF - 다중 서비스 호스트파일 다운로드1
605정성태10/18/200829382.NET Framework: 105. WPF - 닫기 버튼을 없애려면.
604정성태10/18/200830031오류 유형: 60. System.Management.ManagementException - Generic failure [1]
602정성태10/15/200832241오류 유형: 59. WPF - XAML 로딩 시 Visual Studio 비정상 종료 [1]
600정성태10/9/200837162디버깅 기술: 18. TFS Team Build + Source Server = 소스 코드 디버깅 [3]
603정성태10/15/200828645    답변글 디버깅 기술: 18.1. 소스 서버 구성, 그 외의 이야기
599정성태10/5/200833917디버깅 기술: 17. TFS Team Build + Symbol Server [1]
598정성태10/3/200824360VS.NET IDE: 57. VS.NET 2008 - 다중 프로젝트에서 단일 SNK를 사용하는 방법
597정성태10/2/200822906Team Foundation Server: 25. VSTS 2008의 Build Explorer
596정성태10/2/200829829오류 유형: 58. WPF : 드롭다운 유형의 ComboBox가 펼쳐지지 않는 문제
595정성태10/1/200837601디버깅 기술: 16. Watson Bucket 정보를 이용한 CLR 응용 프로그램 예외 분석 [2]
594정성태9/22/200825425.NET Framework: 104. Win32Exception 클래스 소개
591정성태7/24/200821811오류 유형: 57. VS.NET 2008 TFC - 체크인 시에 비프 음과 함께 정지되는 현상
... 166  167  168  169  170  171  172  173  174  175  176  177  178  [179]  180  ...