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件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
直接の回答ではないですけどメモリリークはメモリ不足の意味ではないですよ。
その原因の一つではありますけど。また「メモリが増えていくだけで減りません」ということですがタスクマネージャなどで確認されたのだと思いますが、一般的にOS上で動作するC,C++のライブラリではOSに確保してもらったメモリはプログラムが終了するまでOSには返さず再利用に備えるようになってます。
No.3
- 回答日時:
No.2さんが指摘されているようにデバッカで確認したほうがいいと思います。
仮にメモリーリークしていてたとしてもこの関数じゃないないかも知れません。
あと質問とは関係ないですが、
このコードだと最初にFindFirstFileでヒットしたファイルが無視されて
FindNextFileでヒットする二番目以降のファイルしかコピーされない気が…
わざとだったらごめんなさい。
No.2
- 回答日時:
残るなら既にメモリリークなわけだが・・・。
説明がないけどVisualC++でMFCとWin32APIですよね?
多分この関数は問題無いです。
で、デバッグ起動での終了時にリークしているならリーク情報が出力ウィンドウに表示されるはずですが。
No.1
- 回答日時:
ランタイムなどは、確保したメモリが不要になっても、すぐに返却せずに再利用する場合がありますから、際限なく増えるのでなければ、問題ないように思います。
コード上で確保しているメモリは、それほど多くはないと思うのですが。
CopyFileはWIN32APIですよね。ここでメモリが使われているのであれば、アプリ側の問題ではないでしょう。試にCopyFileをコメントにしてみて、使用メモリが増え続けるか確認してみては?
CopyFileがメモリを消費しているのであれば、SHFileOperationを使ってみるとか。
あと、本題とは関係ありませんが、
> if (fd.cFileName != L"." || fd.cFileName != L"..")
これ、おかしくないですか?
そもそも、ポインタの比較になっていて文字列の比較をしていないようですし、ORで結ぶと常にtrueじゃないかと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
-
VB.netでUSBメモリの固有I...
-
クリスタルレポートでメモリ不...
-
バッチファイルでの実行EXEのメ...
-
メモリ不足
-
メモリの解放について VB6 VBA
-
アセンブラプログラミングの知...
-
変数をあなたの身近なものに例...
-
エクセルのメモリ使用状況/Appl...
-
初心者過ぎる質問ですが、VRAM...
-
「memcpy」と「strcpy」について
-
Apacheでバーチャルホストの最...
-
DirectX9でのテクスチャフォー...
-
Macターミナルで実行中のプログ...
-
緯度、経度の 10進法と 60進法...
-
3のつく数字と3の倍数のみを表...
-
バックグラウンドのプロセスの...
-
TCP/IP通信時のサーバーからの受信
-
実行中の実行ファイルの上書き
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAの配列サイズとメモリに関して
-
C言語で、メモリを解放しないで...
-
大容量のメモリ確保をスワップ...
-
エクセル キャッシュメモリー...
-
エクセルのメモリ使用状況/Appl...
-
「ヒープサイズの設定」て何?
-
ExcelのVBAでメモリ解放できない
-
メモリの解放の仕方
-
メモリのセグメント違反の解決...
-
メモリ不足
-
ファイルマッピング関数で失敗
-
「memcpy」と「strcpy」について
-
closeとメモリの開放について
-
EXCEL-VBAにてADOのレコードセ...
-
マクロのスピードがダウンする??
-
VB.netでUSBメモリの固有I...
-
エクセルVBA 大容量CSVファイル...
-
メモリの消費量について
-
【C言語】再帰が時間がかかる...
-
プログラム実行中に強制終了
おすすめ情報