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 数组,这是有道理的,因为它是一个字符串。分配数组时,必须使用数组删除运算符(通过在删除语句中包含方括号来获得)删除。我很确定 Treb 的解决方案会导致内存泄漏。

于 2008-10-27T15:10:50.300 回答
1

是的你应该。通过调用

 delete[] folderPath;

在您的功能结束时。所有分配的内存都new必须用 释放delete

于 2008-10-27T15:02:06.540 回答
1

是的,你应该释放内存。您调用的任何函数都不会为您执行,也不应该为您执行 - 这没有任何意义。内存是使用向量 new 运算符分配的,因此应该使用向量删除运算符释放,即:

删除 [] 文件夹路径;

于 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 回答