2

Windows Mobile アプリ用の CESetup.dll を作成しています。管理されていない必要がありますが、これについてはほとんど経験がありません。そのため、割り当てたメモリを解放する必要があるかどうか、およびその方法がわかりません。

ここに私が書いた関数があります:

    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;
}

私が理解しているように、folderPathはヒープに割り当てられています。EmptyDirectory() は、ディレクトリ内のすべてのコンテンツを削除する独自の関数です。RemoveDirectory() と DeleteFile() はシステム コールです。

私の質問はfolderPath、関数が終了する前に割り当てを解除する必要がありますか? 必要な場合、どうすればよいですか?

4

5 に答える 5

4

C/C++ プログラミングに慣れていない人に見られるよくある誤解があります。ポインター パラメーターを持つ関数を見ると、変数をnewで割り当てる必要があると思います。そうではありません。有効期間について心配する必要がないため、ローカル変数が適切であり、推奨されます。

あなたはあなたの人生を途方もなく簡素化することができます

TCHAR folderPath[256];

私の好ましい解決策は std::string を使用することですが、それを別の回答に入れました。

于 2008-10-27T15:10:42.530 に答える
3

これを使いたいと思います:

delete [] folderPath;

TCHAR の配列を割り当てているように見えますが、これは文字列であるため理にかなっています。配列を割り当てるときは、配列の削除演算子を使用して削除する必要があります (これは、delete ステートメントに角かっこを含めることによって得られます)。Trebのソリューションでメモリリークが発生することは間違いありません。

于 2008-10-27T15:10:50.300 に答える
1

はい、メモリを解放する必要があります。あなたが呼び出す関数はどれもあなたのためにそれを行いませんし、そうすべきでもありません-それは意味がありません. メモリは vector new 演算子で割り当てられているため、vector delete 演算子で解放する必要があります。つまり、次のようになります。

[] フォルダーパスを削除します。

于 2008-10-27T15:11:22.187 に答える
1

通常、std::string、またはあなたの場合は std::basic_string を使用することをお勧めします。この場合、最終的なパスが 256 文字を超える場合に発生する可能性のあるバッファー オーバーフローを排除します。

    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;
}
于 2008-10-27T15:25:59.097 に答える
1

はい、そうすべきです。電話することで

 delete[] folderPath;

あなたの機能の最後に。で割り当てられたすべてのメモリnewは、で解放する必要がありますdelete

于 2008-10-27T15:02:06.540 に答える