2014-07-17 6 views
1

나는 나의 Win32 응용 프로그램에서 파일을 열려면이 기능을 사용하고 있습니다 :파일 열기 대화 상자 및 메모리 누수

string OpenDialog(HWND hwnd) 
{ 
    OPENFILENAME ofn; 
    TCHAR szFile[MAX_PATH]; 


    ZeroMemory(&ofn, sizeof(ofn)); 
    ofn.lStructSize = sizeof(ofn); 
    ofn.lpstrFile = szFile; 
    ofn.lpstrFile[0] = '\0'; 
    ofn.hwndOwner = hwnd; 
    ofn.nMaxFile = sizeof(szFile); 
    ofn.lpstrFilter = TEXT("All files(*.*)\0*.*\0"); 
    ofn.nFilterIndex = 1; 
    ofn.lpstrInitialDir = NULL; 
    ofn.lpstrFileTitle = NULL; 
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; 
    if(GetOpenFileName(&ofn)) 
    return ofn.lpstrFile; 

} 

이 매우 간단하고, 내가 사용하여 전화 :

string path = OpenDialog(hwnd); 

을 문제는이 함수가 많은 메모리 누수를 일으키는 것을 발견했습니다! 나는 무슨 일이 일어나고 있는지 확실하지는 않지만이 기능을 사용하여 새 파일을 열 때마다 내 응용 프로그램이 RAM에서 더 커지고 커집니다. 이 함수를 사용하여 파일을로드하지 않으면 안정적인 메모리로드가 발생했기 때문에 원인이이 함수인지 100 % 확신합니다.

힌트를주세요. 감사합니다.

+1

'GetOpenFileName'이 0을 반환하면 함수가 정의되지 않은 동작을합니다. 이유는'GetOpenFileName'이 0을 반환하면'return' 값을 지정하지 않았기 때문입니다. – PaulMcKenzie

+0

그래도 함수는이 경우에도 끝나기 때문에 가비지 컬렉터는 여전히 메모리를 해제해야합니다. –

+1

값을 반환하지 못하는 함수를 작성하면 함수가 기술적으로 불완전하기 때문에 컴파일러는 해당 함수로 아무 것도 할 수 없습니다. GetOpenFileName이 0을 반환 할 때 return 문을 추가 한 다음 다시 테스트하면됩니다. 또한 간단한'int main()'함수로 프로그램을 테스트 했는가? 실제로 문제를 일으키는이 함수인지 확인하기 위해? – PaulMcKenzie

답변

1

API를 호출하면 windows는 셸 인터페이스를로드하고 &도 셸 확장 처리기를 호출합니다. 타사 셸 확장 DLL에서 메모리 누수가 발생하면 표시되지 않습니다. 또한 윈도우는 연속 된 여는 동안 열린 파일 대화 상자를 더 빠르게로드하기 위해 일부 셸 객체에 대한 참조를 유지함으로써 일부 최적화를 수행합니다. 이로 인해 처음 사용되는 메모리 스파이크로 볼 수있는 메모리 사용량이 증가 할 수 있습니다.