GlobalAlloc について
質問させて下さい。
VC++ 2005 MFC で開発しております。
仕様の概要と致しまして、
::GlobalAlloc()でHGLOBALを取得し、
メンバ変数に格納(Arrayでリサイクルしていくイメージ)した後、スレッドを走らせ格納したHGLOBALを
使い処理をした後に、GlobalFree()でメモリを開放します。
アプリの仕様上、スレッドの処理に少々時間がかかり
GlobalAlloc()とGlobalFree()が必ずしも一対一で実行されず、
スレッドのGlobalFree()が実行される前に別のGlobalAlloc()がくることがあります。
このような場合、下記のように確保するヒープ領域の取得したアドレスが
少しずつ増えてしまい、最終的には取得できなく(GlobalLockでNULLポインタ)なってしまいます。(4GB越え)
8バイトずつアドレスが増えていくとして
-------------------------------------------------
・一対一の場合
(同じアドレスが使用できる)
確保開放
(1)0008(2)0008
(3)0008(4)0008
(5)0008
・一対一でない場合
(開放される前に確保するので新しいアドレスを使用してしまう)
確保開放
(1)0008(2)0008
(3)0008
(4)0016(5)0008((3)メモリ)
(6)0024
(7)0032
(8)0040(9)0016((4)メモリ)
(10)0024((6)メモリ)
(11)0032((7)メモリ)
(12)0048
:
:
:
-------------------------------------------------
GlobalFree()がもれているのではなく
メモリを確保したものは遅れはするものの必ず開放はしています。
このような場合、上記の「一対一でない場合」の
(6)で「0024」番地ではなく「0008」番地からメモリを確保することは出来ないのでしょうか?
確保と開放が一対一に統合されていればこのような問題はない(常に同じアドレスを使用できるため)のですが、
アプリの使用上、仕方ないと考えております。
説明が複雑になってしまい、わかりにくいとは思いますが、
お詳しい方がおられましたら、ご教授の程宜しくお願い致します。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
>このような場合、下記のように確保するヒープ領域の取得したアドレスが
>少しずつ増えてしまい、最終的には取得できなく(GlobalLockでNULLポインタ)なってしまいます。(4GB越え)
そんなはずはないと思います。マルチスレッドを使わない実験コードを書いて確かめてみてはどうでしょうか。
もちろん、単純に、確保、解放、確保、解放・・・とするのではなくて、
確保、確保、解放、確保、確保、解放、解放・・・・・
といった感じで。
あと、確保する単位が細かすぎるように思えます。もっと大きな単位で確保した場合は、どのような挙動になるでしょうか。
No.1
- 回答日時:
★最も簡単な方法
>確保と開放が一対一に統合されていればこのような問題はない(常に同じアドレスを使用できるため)のですが、
>アプリの使用上、仕方ないと考えております。
スレッドで確保、解放はしないでメインのスレッドで最大のサイズを確保。
プログラム終了時などで解放すれば楽でしょう。
・あとスレッドで処理する場合は排他処理を行います。
メモリ確保、解放だけでなく1つの変数の参照、代入でも排他処理を行うのが常識。
次のリンクを読んでみましょう。
http://itpro.nikkeibp.co.jp/article/COLUMN/20070 …→『第3回 マルチタスクに不可欠な同期の仕組みを学ぶ』
参考URL:http://itpro.nikkeibp.co.jp/article/COLUMN/20070 …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- CPU・メモリ・マザーボード Windows10 64bitパソコンのメモリ 4GBから8GBへ増設 11 2023/01/25 18:20
- CPU・メモリ・マザーボード Windows11アップデート後の不具合(メモリ不足)について 9 2023/01/04 11:34
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- その他(クラウドサービス・オンラインストレージ) Onedriveで実現したい事。2台のPC間で。 2 2023/04/10 20:42
- ふるさと納税 寄付金受領証明書の取り扱いについて 1 2023/03/12 12:01
- CPU・メモリ・マザーボード メモリの増設について 6 2022/12/28 06:41
- CPU・メモリ・マザーボード ゲーミングpcのファンのことについて教えて欲しいです。 6 2023/03/05 07:44
- CPU・メモリ・マザーボード FF14をやるにあたって 3 2022/09/16 22:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
MSDNがgethostbynameではなくge...
-
allocってなんですか?
-
ビットをローテートするプログ...
-
ヒープメモリの解放について
-
指定したメモリアドレスの値の...
-
malloc呼び出し時のセグメンテ...
-
プログラムが途中で強制終了し...
-
bool と BOOL の違い(構造体)
-
callocの処理速度
-
入れ子になった構造体について
-
【VC++6.0(MFC)】メモリの静的...
-
16進ダンプのプログラム
-
DLLのマルチスレッドの動作につ...
-
mallocについて
-
newしないオブジェクトについて
-
C言語に関する質問
-
DLLで同じメモリ領域を参照する...
-
malloc()関数内でセングメント...
-
画像を読み込む配列の確保。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
mallocについて
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
ヒープメモリの解放について
-
C++で、メンバもヒープに確保さ...
-
MSDNがgethostbynameではなくge...
-
プログラムが途中で強制終了し...
-
配列の添え字の最大数とは?
-
Accessで、メモリを開放するタ...
-
ヒープ領域の限界値設定
-
malloc呼び出し時のセグメンテ...
-
スタック破壊の上手な見つけ方...
-
C言語 mallocとfreeについて
-
指定したメモリアドレスの値の...
-
stringの最大サイズ
-
16進ダンプのプログラム
-
64ビットと32ビットの違い
-
入れ子になった構造体について
-
free関数で動作が止まる
おすすめ情報