ヒープのメモリを解放します。どうすればいいですか?
-
04-07-2019 - |
質問
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
の割り当てを解除すべきですか?必要に応じて、どうすればいいですか?
解決
これを使用したいと思う:
delete [] folderPath;
TCHARの配列を割り当てているように見えますが、これは文字列なので意味があります。配列を割り当てるときは、配列削除演算子を使用して削除する必要があります(削除ステートメントに角括弧を含めることで取得できます)。 Trebのソリューションでメモリリークが発生することは間違いありません。
他のヒント
C / C ++プログラミングに慣れていない人によく見られる誤解があります。ポインタパラメータを持つ関数を見ると、変数は new で割り当てる必要があると思います。そうではありません。ローカル変数が適切であり、その寿命について心配する必要がないためです。
次の操作を行うことで、人生を大幅に簡素化できます
TCHAR folderPath[256];
私の推奨する解決策はstd :: stringを使用することですが、別の回答に入れました。
はい、メモリを解放する必要があります。あなたが呼び出す関数はどれもあなたのためにそれを行うことはありませんし、そうすべきではありません-それは意味をなさないでしょう。メモリはベクトルnew演算子で割り当てられたため、ベクトル削除演算子で解放する必要があります。つまり:
delete [] folderPath;
通常は、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;
}
はい、そうすべきです。呼び出し
delete[] folderPath;
関数の最後。 new
で割り当てられたすべてのメモリは、 delete
で解放する必要があります。