プロが教える店舗&オフィスのセキュリティ対策術

C++にあるCopyFile関数でフォルダをコピーする関数を作成しました。
コピー関数を使うプログラムは常駐プログラムです。

Aフォルダに決められたファイルが作成されたら、A1フォルダを作成してそのなかにAフォルダのファイルをコピーしていきます。
A1の次はA2、A3…というふうにどんどんファイルをコピーしていくのですが、メモリが増えていくだけで、減りません。
このままいくとメモリリークとなってしまうと思うのですが、なぜ増えて行くのでしょうか?
下がプログラムです。
int FoldersCopy(CString from, CString to)
{
HANDLE hSearch;
WIN32_FIND_DATA fd;
CString FindPath;//検索用のパス
FindPath = from;//コピー
if (FindPath.Right(1) != L"\\")
{
FindPath += L"\\";
}
FindPath += L"*.*";
hSearch = FindFirstFile(FindPath, &fd);
while(TRUE)
{
if (!FindNextFile(hSearch, &fd))
{
break;
}
if (fd.cFileName != L"." || fd.cFileName != L"..")
{
CString fFilepath, tFilepath;
fFilepath = from + fd.cFileName;
tFilepath = to + fd.cFileName;
CopyFile(fFilepath, tFilepath, TRUE);
fFilepath.Empty();
tFilepath.Empty();
}

}
FindClose(hSearch);
return 0;
}
解放はしっかりやっていると思うのですが、何かいけない場所はありますか?
そもそも常駐プログラムでファイルコピーをしたらダメなのでしょうか?

よろしくお願い致します。

A 回答 (4件)

ランタイムなどは、確保したメモリが不要になっても、すぐに返却せずに再利用する場合がありますから、際限なく増えるのでなければ、問題ないように思います。


コード上で確保しているメモリは、それほど多くはないと思うのですが。
CopyFileはWIN32APIですよね。ここでメモリが使われているのであれば、アプリ側の問題ではないでしょう。試にCopyFileをコメントにしてみて、使用メモリが増え続けるか確認してみては?
CopyFileがメモリを消費しているのであれば、SHFileOperationを使ってみるとか。

あと、本題とは関係ありませんが、

> if (fd.cFileName != L"." || fd.cFileName != L"..")

これ、おかしくないですか?
そもそも、ポインタの比較になっていて文字列の比較をしていないようですし、ORで結ぶと常にtrueじゃないかと思います。
    • good
    • 0

残るなら既にメモリリークなわけだが・・・。


説明がないけどVisualC++でMFCとWin32APIですよね?
多分この関数は問題無いです。
で、デバッグ起動での終了時にリークしているならリーク情報が出力ウィンドウに表示されるはずですが。
    • good
    • 0

No.2さんが指摘されているようにデバッカで確認したほうがいいと思います。


仮にメモリーリークしていてたとしてもこの関数じゃないないかも知れません。

あと質問とは関係ないですが、
このコードだと最初にFindFirstFileでヒットしたファイルが無視されて
FindNextFileでヒットする二番目以降のファイルしかコピーされない気が…

わざとだったらごめんなさい。
    • good
    • 0

直接の回答ではないですけどメモリリークはメモリ不足の意味ではないですよ。

その原因の一つではありますけど。

また「メモリが増えていくだけで減りません」ということですがタスクマネージャなどで確認されたのだと思いますが、一般的にOS上で動作するC,C++のライブラリではOSに確保してもらったメモリはプログラムが終了するまでOSには返さず再利用に備えるようになってます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!