J'écris une application simple qui affiche tous les fichiers dans un répertoire à la console. Pour ce faire, j'alloue dynamiquement de la mémoire dans la fonction PathCreator()
et renvoie un pointeur vers cette mémoire. Je ne sais pas comment libérer correctement ce segment de mémoire dans GetAllFiles()
. Lorsque j'utilise le code ci-dessous, j'obtiens une exception de dépassement de pile. Comment puis-je réparer cela? S'il vous plaît ne me propose pas d'utiliser quelque chose qui n'a pas besoin de mémoire allouée dynamiquement, je veux juste réparer mon code.Dépassement de pile dans la fonction récursive
#include "stdafx.h"
#include <windows.h>
#include <iostream>
wchar_t *PathCreator(wchar_t *dir, wchar_t *fileName);
int is_directory(wchar_t *p)
{
wchar_t *t = PathCreator(p,L"\\");
WIN32_FIND_DATA file;
HANDLE search_hendle = FindFirstFile(t, &file);
long error = GetLastError();
if(error == 267)
{
return 0;
}
else
{
return 1;
}
}
wchar_t *PathCreator(wchar_t *dir, wchar_t *fileName)
{
wchar_t* path = 0;
int size = 0;
wchar_t *d = dir;
wchar_t *f = fileName;
while(*d != '\0')
{
d++;
size++;
}
while(*f != '\0')
{
f++;
size++;
}
path = new wchar_t[(size+=3) * sizeof(wchar_t)];
int j = 0;
while(j < size)
{
path[j] = '\0';
j++;
}
int i;
i = 0;
while(*dir != '\0')
{
path[i] = *dir;
i++;
dir++;
}
path[i++] = '\\';
wchar_t *t = fileName;
while(*t != '\0')
{
path[i] = *t;
i++;
t++;
}
path[i] = '\0';
return path;
}
void GetAllFiles(wchar_t* dir)
{
wchar_t *p = 0;
int i = 0;
WIN32_FIND_DATA file;
wchar_t *t = PathCreator(dir, L"*");
HANDLE search_hendle = FindFirstFile(t, &file);
if(search_hendle)
{
do
{
p = PathCreator(dir,file.cFileName);
if(!is_directory(p))
{
std::wcout << p << std::endl;
}
else
{
GetAllFiles(p);
}
delete [] p;
}
while(FindNextFile(search_hendle, &file));
}
delete [] t;
FindClose(search_hendle);
}
int _tmain(int argc, _TCHAR* argv[])
{
GetAllFiles(L"C:\\Users");
}
Le rendre itératif? –
@John Dibling Pouvez-vous décrire cela plus en détail? – abilash
Légèrement hors-sujet: C et C++ ne sont pas le même langage. Comme il est clair que vous utilisez C++, il peut être judicieux de travailler sur vos concepts C++. Par exemple, pourquoi 'new' et' delete' sont déconseillés (en faveur des pointeurs intelligents), et pourquoi utiliser 'std :: string' (ou' std :: wstring') est préférable à l'utilisation de pointeurs de type C. – tenfour