Question

J'écris un CESetup.dll pour une application Windows Mobile. Il doit être non géré, avec lequel j'ai peu d'expérience. Je ne sais donc pas si je devrais libérer la mémoire que j'alloue et comment je le fais.

Voici la fonction que j'ai écrite:

    Uninstall_Init(
    HWND        hwndParent,
    LPCTSTR     pszInstallDir
)
{
    LPTSTR folderPath = new TCHAR[256];
    _stprintf(folderPath, _T("%s\\cache"), pszInstallDir);
    EmptyDirectory(folderPath);
    RemoveDirectory(folderPath);

    _stprintf(folderPath, _T("%s\\mobileadmin.dat"), pszInstallDir);
    DeleteFile(folderPath);

// To continue uninstallation, return codeUNINSTALL_INIT_CONTINUE
// If you want to cancel installation,
// return codeUNINSTALL_INIT_CANCEL
return codeUNINSTALL_INIT_CONTINUE;
}

Si je comprends bien, folderPath est alloué sur le tas. EmptyDirectory () est ma propre fonction qui supprime tout le contenu du répertoire. RemoveDirectory () et DeleteFile () sont des appels système.

Ma question est la suivante: dois-je désallouer folderPath avant la fermeture de la fonction? Si je devais le faire, comment puis-je le faire?

Était-ce utile?

La solution

Je pense que vous souhaitez utiliser ceci:

delete [] folderPath;

On dirait que vous allouez un tableau de TCHAR, ce qui est logique puisque c'est une chaîne. Lorsque vous allouez un tableau, vous devez supprimer à l'aide de l'opérateur de suppression de tableau (obtenu en incluant les crochets dans l'instruction de suppression). Je suis sûr que vous obtiendrez une fuite de mémoire avec la solution de Treb.

Autres conseils

Il existe une perception erronée courante chez des personnes qui ne sont pas habituées à la programmation C / C ++: lorsqu'elles détectent une fonction avec un paramètre de pointeur, elles pensent que la variable doit être allouée avec new . Ce n'est pas le cas, une variable locale convient et est préférable, car vous n'avez pas à vous soucier de sa durée de vie.

Vous pourriez énormément simplifier votre vie en faisant

TCHAR folderPath[256];

Ma solution préférée serait d’utiliser std :: string, mais j’ai mis cela dans une réponse séparée.

Oui, vous devriez libérer la mémoire. Aucune des fonctions que vous appelez ne le fera pour vous, et elles ne devraient pas non plus - cela n’aurait aucun sens. La mémoire a été allouée avec l’opérateur new vector et doit donc être libérée avec l’opérateur delete vector, c.-à-d.:

supprimer [] folderPath;

Il est généralement préférable d’utiliser std :: string, ou dans votre cas, std :: basic_string. Dans ce cas, cela évite tout débordement de mémoire tampon lorsque le chemin final contient plus de 256 caractères.

    Uninstall_Init(
    HWND        hwndParent,
    LPCTSTR     pszInstallDir
)
{
    std::basic_string<TCHAR> folderPath = pszInstallDir;
    folderPath.append(_T("\\cache"));
    EmptyDirectory(folderPath.c_str());
    RemoveDirectory(folderPath.c_str());
    folderPath = pszInstallDir;
    folderPath.append(_T("\\mobileadmin.dat"));
    DeleteFile(folderPath.c_str());
// To continue uninstallation, return codeUNINSTALL_INIT_CONTINUE
// If you want to cancel installation,
// return codeUNINSTALL_INIT_CANCEL
return codeUNINSTALL_INIT_CONTINUE;
}

Oui, vous devriez. En appelant

 delete[] folderPath;

à la fin de votre fonction. Toute mémoire affectée avec new doit être libérée avec delete .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top