안부 게시판에 Gerndal님이 아래의 코드를 실행하면 메모리 leak이 난다고 알려 주셨습니다.
#include "stdafx.h"
#include <ppl.h>
using namespace Concurrency;
int main()
{
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
parallel_invoke( [] { }, [] { } );
return 0;
}
코드를 보면 메모리 leak이 날 조건이 하나도 없습니다. 그런데 왜 메모리 leak이 날까요?
영문판 MSDN 커뮤니티에 가보면 같은 문제로 질문하고 있는 것을 찾을 수 있습니다.
메모리 leak이 감지되는 것은 정말 메모리 leak이 발생한 것은 아닙니다. 문제는 ConcRT의 스케줄러가 해제되기 전에 프로그램이 먼저 종료되기 때문에 발생하는 것입니다.
위 코드를 보면 스케줄러와 관련된 코드는 하나도 보이지 않지만 암묵적으로 사용하고 있습니다.
이 문제를 해결하기 위해서는 스케줄러를 시작 부분에서 명시적으로 정의하고 프로그램이 종료하기 전에 스케줄러를 명시적으로 해제하는 것으로 해결할 수 있습니다( 혹은 정말 메모리 leak이 아니니 그냥 무시해도 됩니다 ).
메모리 leak 경고를 발생시키지 않기 위해서는 아래와 같이 하면 됩니다.
int main()
{
HANDLE hEvent = CreateEvent( NULL, TRUE, FALSE, NULL
);
CurrentScheduler::Create( SchedulerPolicy()
);
CurrentScheduler::RegisterShutdownEvent( hEvent );
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
parallel_invoke( [] {}, [] {} );
CurrentScheduler::Detach();
WaitForSingleObject( hEvent, INFINITE );
CloseHandle( hEvent );
Sleep(500);
return 0;
}
암묵적으로 스케줄러를 정의했다면 프로그램이 종료될 때 깔끔하게 해제되어야 하는데 이 부분이 매끄럽지 못한 것이 아쉽습니다. 현재 관련 개발자는 이번 버전에서는 깔끔하게 처리하는 부분을 미처 넣지 못했지만 꼭 다음 버전(VC++ 11)에서는 꼭 해결하겠다고 이야기 합니다.
ps : 이것은 4월15일 세션에서 제가 언급하였습니다만 블로그에는 포스팅을 늦게 하게 되었습니다.
'VC++ 10 Concurrency Runtime' 카테고리의 다른 글
| Asynchronous Agents Library - agent. 1 ( 상태 ) (5) | 2010/06/05 |
|---|---|
| Asynchronous Agents Library 소개 (1) | 2010/05/29 |
| Concurrency Runtime(ConcRT)의 디버그 모드에서 메모리 leak 문제 (4) | 2010/04/19 |
| Parallel Patterns Library(PPL) - concurrent_queue - 2 (0) | 2010/01/16 |
| Parallel Patterns Library(PPL) - concurrent_queue - 1 (0) | 2009/12/18 |
| Parallel Patterns Library(PPL) - concurrent_vector - 2 (0) | 2009/12/09 |




댓글을 달아 주세요
질문에 답변 해주셔서 감사합니다.
VS 다음 버전이 아닌 VS2010버전에서 패치식으로 해결이 가능하면
좋겠네요^^
음~
알려주신데로 하면
Leak이 났다가 나지 않았다가 그러네요
전체에 감싸서 코드를 넣어서 그런가요?
쓸때마다 각각을 감싸야 할까요?
제 생각으로는 프로그램 초기와 마지막에 넣어주면 될거라고 생각합니다. ConcRt의 라이브러리를 사용할 때마다 해줄 필요는 없고, 해서도 안될거라고 생각합니다.
그리고 스케줄러를 명시적으로 정의하고 해제하는 것은 ifdef 등으로 디버그모드에서 메모리릭 체크할 때만 사용하면 좋을 것 같습니다. 또 명시적으로 정의했는데 leak 경고가 나왔다 안 나왔다하면 마지막의 Sleep 값을 좀 더 크게 해보세요
Sleep이 전혀 영향을 미치지 않는듯 합니다.
지금으로써는 Leak검사를 할때의 코드와 그렇지 않을때의
코드를 따로 작성해야 할 듯 하네요
parallel 프로그래밍이 아주 편리해졌는데,
이 문제때문에 좀 번거로워 졌네요~^^