- 締切済み
C++のCopyFileでメモリが増える
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; } 解放はしっかりやっていると思うのですが、何かいけない場所はありますか? そもそも常駐プログラムでファイルコピーをしたらダメなのでしょうか? よろしくお願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- wormhole
- ベストアンサー率28% (1626/5665)
直接の回答ではないですけどメモリリークはメモリ不足の意味ではないですよ。その原因の一つではありますけど。 また「メモリが増えていくだけで減りません」ということですがタスクマネージャなどで確認されたのだと思いますが、一般的にOS上で動作するC,C++のライブラリではOSに確保してもらったメモリはプログラムが終了するまでOSには返さず再利用に備えるようになってます。
- Shalalaex
- ベストアンサー率37% (6/16)
No.2さんが指摘されているようにデバッカで確認したほうがいいと思います。 仮にメモリーリークしていてたとしてもこの関数じゃないないかも知れません。 あと質問とは関係ないですが、 このコードだと最初にFindFirstFileでヒットしたファイルが無視されて FindNextFileでヒットする二番目以降のファイルしかコピーされない気が… わざとだったらごめんなさい。
- zwi
- ベストアンサー率56% (730/1282)
残るなら既にメモリリークなわけだが・・・。 説明がないけどVisualC++でMFCとWin32APIですよね? 多分この関数は問題無いです。 で、デバッグ起動での終了時にリークしているならリーク情報が出力ウィンドウに表示されるはずですが。
- m-take0220
- ベストアンサー率60% (477/782)
ランタイムなどは、確保したメモリが不要になっても、すぐに返却せずに再利用する場合がありますから、際限なく増えるのでなければ、問題ないように思います。 コード上で確保しているメモリは、それほど多くはないと思うのですが。 CopyFileはWIN32APIですよね。ここでメモリが使われているのであれば、アプリ側の問題ではないでしょう。試にCopyFileをコメントにしてみて、使用メモリが増え続けるか確認してみては? CopyFileがメモリを消費しているのであれば、SHFileOperationを使ってみるとか。 あと、本題とは関係ありませんが、 > if (fd.cFileName != L"." || fd.cFileName != L"..") これ、おかしくないですか? そもそも、ポインタの比較になっていて文字列の比較をしていないようですし、ORで結ぶと常にtrueじゃないかと思います。