2014-07-17 7 views
1

J'utilise cette fonction pour ouvrir un fichier dans mon application win32:de dialogue Ouvrir le fichier et les fuites mémoire

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; 

} 

Ceci est assez simple, et je l'appelle à l'aide:

string path = OpenDialog(hwnd); 

Le Le problème est que j'ai trouvé que cette fonction cause beaucoup de fuites de mémoire! Je ne suis pas sûr à 100% de ce qui se passe, mais chaque fois que j'ouvre un nouveau fichier en utilisant cette fonction, mon application devient de plus en plus grande en RAM. Je suis 100% sûr que la cause est cette fonctions, parce que si je ne charge pas un fichier en utilisant cette fonction, j'ai une charge de mémoire stable.

Un indice s'il vous plaît? Merci beaucoup!

+1

Votre fonction présente un comportement indéfini si 'GetOpenFileName' renvoie 0. La raison en est que vous n'avez pas spécifié de valeur' return' si 'GetOpenFileName' renvoie 0. – PaulMcKenzie

+0

Bien, mais la fonction se termine toujours dans ce cas, le garbage collector devrait toujours libérer la mémoire, non? –

+1

Lorsque vous écrivez une fonction qui ne renvoie pas de valeur, le compilateur est libre de faire quoi que ce soit avec cette fonction, car la fonction est techniquement incomplète. Ajoutez simplement une déclaration de retour lorsque 'GetOpenFileName' renvoie 0, puis retest. En outre, avez-vous testé votre programme avec une simple fonction 'int main()', juste pour vous assurer que cette fonction cause réellement un problème? – PaulMcKenzie

Répondre

1

Lorsque vous invoquez l'API, Windows charge l'interface du shell & appelle également les gestionnaires d'extension shell. S'il y a une fuite de mémoire introduite par des DLL d'extension shell tierces, elle ne sera pas visible. Windows effectue également une optimisation en gardant des références à certains des objets shell pour un chargement plus rapide de la boîte de dialogue ouverte sur les ouvertures consécutives. Cela peut entraîner une augmentation de l'utilisation de la mémoire que vous verrez comme un pic de mémoire pour la première fois.

Questions connexes