Je doute que cela affectera beaucoup de gens car cela est assez obscur, mais si vous obtenez votre fichier * comme ceci:
HANDLE hMyFile = CreateFile(...);
FILE* pFile = _fdopen(_open_osfhandle((long)hMyFile, <flags>), "rb");
CloseHandle(hMyFile);
Ensuite, vous fuite d'un jet pour chaque fichier que vous ouvrez. Après avoir fait _open_osfhandle et _fdopen, vous devez appeler fclose() sur le fichier pFile pour fermer votre handle. CloseHandle n'est apparemment pas assez intelligent pour libérer le croc que fdopen associe à votre poignée, mais fclose est assez intelligent pour fermer votre poignée avec le croc de FILE *. L'application sur laquelle je travaillais faisait cela parce qu'une certaine API passait autour des HANDLEs, et un implémenteur particulier de l'API avait besoin d'un FICHIER *, donc l'implémenteur a fait le truc _fdopen/_open_osfhandle pour obtenir un FICHIER *. Cependant, cela signifiait que l'appel CloseHandle de l'appelant était insuffisant pour fermer complètement le HANDLE. Le correctif consistait à dupliquer d'abord le HANDLE entrant, puis le code FILE * pouvait correctement fclose() le FICHIER * sans casser le HANDLE de l'appelant.
programme cassé Exemple:
#include "stdafx.h"
#include <Windows.h>
#include <io.h>
#include <assert.h>
#include <fcntl.h>
int _tmain(int argc, _TCHAR* argv[])
{
for(int x = 0;x < 1024; x++)
{
HANDLE hFile = CreateFile(L"c:\\temp\\rawdata.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
FILE* pFile = _fdopen(_open_osfhandle((long)hFile, _O_RDONLY | _O_BINARY), "rb");
assert(pFile); // this assert will go off at x=509, because _getstream() only has 512 streams, and 3 are reserved for stdin/stdout/stderr
CloseHandle(hFile);
}
return 0;
}
Je presque soupçonner un problème de permissions liées. Exécuter en mode débogage signifie élevé? Quel système d'exploitation et quel environnement de développement? – cfeduke
Qu'est-ce que "FILE * __cdecl _getstream" en haut de votre message? De plus, vous n'avez pas besoin de parenthèses autour du "rb". – paxdiablo