2012-05-07 7 views
0

누구든지 MFC 응용 프로그램에서 메모리 누수를 도와 줄 수 있습니까? 이 프로그램은 다음 코드 블록없이 제대로 작동하는 것 같습니다. 블록은 여러 작업의 조건부 실행과 MFC 대화 상자 데이터 멤버에 대한 데이터 전달을 포함하며, MFC 대화 상자의 표시기가 업데이트됩니다. 다른 테스트는 디버그 창에 메모리 누수 메시지가 있다는 것을 제외하면 모든 것이 정상적으로 작동 함을 보여줍니다. 플랫폼 : WIN 7 64 비트, MSVC 2011. 감사합니다!스레드가있는 MFC 응용 프로그램에서 메모리 누수가 발생했습니다.

#include <vector> 
#include <thread> 

//Implementation parallel tasking 
void CMASTERDlg::OnCompositeParalleltasking() 
{ 
const int totTsk=8; 
BOOL select[totTsk]={ 
    m_Parallel_Audio, 
    m_Parallel_DDS, 
    m_Parallel_HV, 
    m_Parallel_Monitor, 
    m_Parallel_PDA, 
    m_Parallel_Pulnix, 
    m_Parallel_Supertime, 
    m_Parallel_Temp}; 

//Put all selected tasks in a thread vector 
std::vector<std::thread> threads; 
auto pvThread = threads.begin(); 

if (m_Parallel_Audio) 
    threads.push_back(std::thread(Audio, 1)); 
if (m_Parallel_DDS) 
    threads.push_back(std::thread(DDS, 1, 1)); 
if (m_Parallel_HV) 
    threads.push_back(std::thread(HVgetShow, this, 3)); 
if (m_Parallel_Monitor) 
    threads.push_back(std::thread(MonitorgetShow, this)); 
if (m_Parallel_PDA) 
    threads.push_back(std::thread(PDAgetShow, this)); 
if (m_Parallel_Pulnix) 
    threads.push_back(std::thread(DoNothing, 1)); 
if (m_Parallel_Supertime) 
    threads.push_back(std::thread(MMCS,Sequence_id, static_cast<LPCSTR>(CStringA(loopnum)))); 
if (m_Parallel_Temp) 
    threads.push_back(std::thread(TempgetShow,this)); 

pvThread = threads.begin(); 
while (pvThread != threads.end()) 
{ 
    pvThread->join(); 
    pvThread++; 
} 

//update data on front panel 
UpdateData(FALSE); 
UpdateWindow(); 


//count selected tasks and output message 
int j=0, count=0; 
for(j=0; j<totTsk; j++) { 
    if (select[j]) count++; 
} 
char buffer[2]; 
itoa (count,buffer,10); 
string message=string(buffer)+" tasks completed in parallel\n"; 
TRACE(message.c_str()); //Message in debugging window 

} 
+1

게시 된 코드에 메모리 할당이없는 것으로 나타나기 때문에 시작한 스레드 중 하나가 실행하는 함수 중 하나에서 메모리 누수가 거의 발생합니다. – Chad

+0

@ChadThanks Chad. 나는 아래 코드와 같이 하나의 스레드와 간단한 do-nothing 함수를 사용하여 코드를 테스트했으며 비슷한 메모리 누수가 발생하여 설정이 잘못되었는지 궁금해졌습니다. 또한 구현이 끝날 무렵에 예상보다 일찍 메시지가 나왔다는 메시지가 나왔습니다. void DoNothing() // 테스트 함수 { \t // 아무 것도하지 않음 } – eLions

+0

추가 한 스레드가 MFC 대화 상자의 스레드와 충돌하는 것처럼 보입니다. BTW, 코드 블록은 잘 GUI가 아닌 프로젝트에서 실행할 수 있습니다. – eLions

답변

0

코드

pvThread = threads.begin(); 
while (pvThread != threads.end()) 
{ 
    pvThread->join(); 
    pvThread++; 
} 

나에게 의심 보인다. 이 루프에 처음으로, 현재 스레드 (주 응용 프로그램 UI 스레드라고 가정)는 해당 스레드가 완료 될 때까지 첫 번째 스레드에서 join()을 호출하면 차단됩니다. 첫 번째 스레드가 다른 스레드보다 적어도 더 오래 걸리면 결국 무의미한 스레드에서 join()을 호출하게됩니다. 아마도이 시스템을 처리하는 동안 시스템에서 뭔가가 유출되고 있습니까?

+0

감사합니다. pnswdv. 이것은 문제의 가능성이 매우 높습니다. 이 문제를 해결할 수있는 힌트가 있습니까? 감지 된 메모리 누수! 개체 덤핑 -> {389} 정상 블록 (0x00631518, 56 바이트) 데이터 : <> 01 00 00 00 00 00 00 00 00 00 00 00 00 00 개체 덤프가 완료되었습니다. – eLions

+1

누군가가 관심이있는 경우 위의 문제는 직접 스레드를 사용하는 대신 MFC 라이브러리에서 AfxBeginThread 함께 해결됩니다. – eLions

관련 문제