현재 메모리 누수에 대한 코드를 확인 중입니다.이 가능성이 저를 강타했습니다. 기본적으로 내가하고있는 의사 코드는 다음과 같습니다.스레드는 메모리를 할당하고 주 프로세스는 죽습니다. 어떻게됩니까?
void thread_func()
{
char *fileName = malloc(someSize);
/* Do something with fileName and other things */
/* Enter a critical section */
modify some global variables
/*Exit critical section */
free(fileName);
return;
}
이 함수는 DLL 내부에 있습니다. 중요한 섹션과 다른 것들도 같은 DLL 안에있는 함수에 의해 초기화됩니다.
내 주요 프로세스 (GUI)에는 취소 버튼이 있습니다. 사용자가 해당 버튼을 클릭하면 필자는 중요한 부분을 파괴하는 DLL 정리 기능을 호출합니다.
사용자가 thread_func()
을 실행하는 동안 취소를 클릭하면 thread_func()
이 계속 실행됩니다. 임계 구역 코드에 도달하면 임계 구역은 유효하지 않으므로 여기서 나가고 있습니다. 이것은 스레드 내에서 취소 이벤트를 확인하는 방법입니다 (내 응용 프로그램의 아무 것도 thread_func()
실행 중 DLL의 정리를 호출 할 수 없기 때문에).
임계 섹션이 유효하지 않은 경우 fileName
을 thread_func()
에 놓을 수 없습니다. 메인 프로세스가 종료 된 이후 thread_func()
은 fileName
에 대한 액세스 권한을 상실했기 때문에 내 생각 인 것 같습니다. 내 추측이 맞습니까? 내 주요 질문은,이 경우에 fileName
을 해제하지 않으면 메모리 누수 위험이 있습니까?
관련 정보를 꽤 많이 검색했지만 지금까지 아무 것도 찾지 못했습니다. 나는 누군가가 올바른 방향으로 나를 가르키고/나의 질문에 대답 할 수 있다면 매우 행복 할 것이다.
감사합니다.
편집 : 나는 KOL의 제안에 따라 일부 예비 시험을하기로 결정
(아래 답변을 참조). 나는 단지 이해할 수없는 이상한 것을 발견했다. 이제 다음과 같이 내 코드는 다음과 같습니다
void thread_func()
{
char *fileName = malloc(someSize);
/* Do something with fileName and other things */
if(threadTerminated)
{
/* Cleanup */
return;
}
/* Enter a critical section */
modify some global variables
/*Exit critical section */
free(fileName);
return;
}
을 그리고 내 GUI에서, 내의 OnCancel 이벤트 핸들러는 같은 것입니다 :
void OnCancel()
{
threadTerminated = TRUE;
WaitForMultipleObjects(noOfRunningThreads, threadHandles, TRUE, INFINITE);
/* Other cleanup code */
}
나는 WaitForMultipleObjects()
중단 무기한 내 GUI가 응답 것으로 나타났습니다합니다. WaitForMultipleObjects()
빨리 돌아 가야하지 않습니까? 또한 에서 threadTerminated
이 TRUE
인 경우 클린업이 발생하지 않습니다.
가장 이상한 부분은 IMO입니다. WaitForMultipleObjects()
을 제거하면 제 코드가 제대로 작동합니다! 청소는 thread_func()
안에 포함하여 모든 청소가 이루어집니다. 누군가가 나를 이해하도록 도와 줄 수 있습니까?
지금 당장은 threadTerminated
을 확인하고 있습니다. 나는 나중에 다른 중요한 요점에서 그것을 점검 할 것이다. 무슨 일이 일어나는지 이해했는지 확인하기 위해이 작업을하고 있습니다.
다시 한번 감사드립니다! 귀하의 답변은 매우 유용합니다.
다른 유형의 메모리 누수가 있습니다. 누출이 커지지 않는 경우 프로그램이 어쨌든 종료되고 누수가 시간이 지남에 따라 커지지 않기 때문에 실제로 문제보다 불편합니다. –
@claptrap, 좋은 지적입니다! 그러나 내가 찾은 메모리 누수 시나리오를 지우고 싶습니다. –
프로세스가 종료 될 때 DLL의 정리 기능이 호출되는 경우 단순히 중요한 섹션을 파괴하지 마십시오. 건물이 철거되어 바닥을 청소할 필요가 없습니다! DLL이 언로드되지만 프로세스가 계속 진행될 경우를 처리해야하는 경우 기존 응답마다 스레드와 정리를 동기화해야합니다. 중요한 섹션이 없어도 스레드가 코드를 실행하고있는 동안 안전하게 DLL을 언로드 할 수는 없습니다. –