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!
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
Bien, mais la fonction se termine toujours dans ce cas, le garbage collector devrait toujours libérer la mémoire, non? –
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