問題タブ [heapalloc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
2486 参照

c++ - HeapAlloc が断続的に失敗する

呼び出し元のアプリケーションに代わって何らかの処理を行う DLL (VC2005 を使用して構築) があります。この処理にはかなりのメモリが必要です。DLL は、次のように heapAlloc を介してこのメ​​モリを作成します。

ヒープは次の方法で割り当てられます。

作成後、実際に 20 個の myStructs を割り当て、それを確実に処理できるように解放します。したがって、十分なスペースがあることがわかります。

問題は、HeapAlloc が NULL を返す場合があることです。それが起こった場合、HeapValidate(m_hStackHeap, 0, NULL)常にゼロ以外を返す a を実行します (すべてが順調であることを意味します)。したがって、ヒープは問題ないことがわかります。

また、同時に 10 を超える同時割り当てが発生しないことも認めているため、最初の heapCreate で十分に予約されているため、十分なスペースがあるはずです。

HeapAlloc への次の呼び出しは、多くの場合成功します。動作は非常に散発的です。正常に動作し、数回割り当てに失敗してから、再び正常に動作し始めます。

何が起こっているかについてのアイデアはありますか?

0 投票する
1 に答える
80 参照

windows - ポインター Windows を使用すると、システムがより多くのメモリを割り当てるのはなぜですか?

HeapAlloc を使用して 400 MB などの大量のメモリを割り当てていますが、プログラムのメモリ使用量を確認すると、実際には 1 GB ほど使用しています。

プログラムをデバッグしたところ、このコードを実行するとメモリ使用量が増加することがわかりました

なぜこうなった??

0 投票する
0 に答える
3142 参照

winapi - malloc は NULL を返し、errno を ENOMEM に設定しますが、使用可能なヒープ領域は十分にありますか?

malloc()に戻りNULL、設定errnoする状況がありますENOMEM。ただし、CRT ヒープ (拡張可能) には、使用できる十分なメモリがあります。の時点でmalloc、私のプロセス メモリは約 900 MB です。ホスト プロセスは、Sun HotSpot JVM の下で実行される Java 実行可能ファイルです。

malloc()私がやっているのは80メガバイトで、失敗します。60 MB の割り当てを行うと、成功します。その後、50 MB の割り当てに続いて別の割り当てが行われ、別の割り当ても成功します。明らかに、まだ多くのメモリが残っていますが、80 MB の malloc は OS が消化するには大きすぎるようです。

4 GB RAM の Windows 7 x64 SP1 を使用しています。私のプロセスは、VC++ 2010 SP1 で構築された 32 ビット プロセスです。Win 7 のデフォルトである Low Fragmentation Heap を使用しています。HeapQueryInformation でも確認しました。私が使用している VC2010 C ランタイムは、次の方法でヒープを作成します。

のドキュメントによると、HeapCreateは512KB を超えるブロックHeapAllocを自動的に呼び出します。VirtualAlloc

malloc()これがメモリ不足でない場合、一体何が失敗する可能性がありますか? 私の記憶はあまりにも断片的ですか?Windows はヒープを自動的に圧縮すると思っていました。これは本当に奇妙です。私はこれまでにこの動作を見たことがありません。

Windows XP SP3 32 ビットを搭載した別のコンピュータが同じ動作を示しています。

ありがとう、マーティン

0 投票する
2 に答える
388 参照

c++ - 関数内の VC++ HeapAlloc が null ポインターを与える

HeapAlloc()で使用されるバッファを割り当てるために使用しようとしていますSetupDiGetDeviceRegistryProperty()

内部GetDeviceInformation()には次のものがあります。

そして、GetRegistryProperty()私は持っています:

HeapAlloc()GetRegistryProperty()戻るまで期待どおりに動作します (バッファーはプロパティで満たされます) 。この時点で、バッファは常に NULL です。これも想定内?それを作成した関数の寿命を過ぎた配列を指す char * を返すにはどうすればよいですか? HeapAlloc() の仕組みを理解していないと思います。

別の関数でそれを持っている理由は、異なるsGetRegistryProperty()で複数回呼び出したいからです。DWORD Propertyコードを別の関数に移動する前は、完全に機能していました。

0 投票する
1 に答える
5764 参照

windows - HeapCreate と HeapAlloc の混乱

私は動的メモリ管理に関するプロジェクトを行っています。HeapCreate 関数と HeapAlloc 関数について混乱しています。

HeapCreate() 関数の場合、ヒープを作成でき、関数は HANDLE を返します。ヒープのサイズを初期化できます。

winHandle = HeapCreate( 0, 2 * 1024, 0); としましょう。

次に、HeapAlloc 関数を使用して、このヒープに割り当てることができます。しかし、ヒープのサイズについて混乱しています。例を試してみます。このヒープで HeapAlloc( winHandle, 0, 1024) を 2 回呼び出すので、合計は 2 * 1024 になります。ただし、HeapAlloc を何度も呼び出してもエラーは発生しません。

HeapAlloc( winHandle, 0, 1024) を 3 回呼び出すとします。割り当ての合計サイズは 3 * 1024 になります。これはヒープ サイズ 2 * 1024 よりも大きくなります。ただし、エラーは発生しません。

この質問に答えるのを手伝ってくれる人はいますか?

ありがとう、

ここにテストコードがあります。

0 投票する
1 に答える
795 参照

c++ - 「LPVOID」はタイプ X のエンティティに割り当てることはできません

USBデバイスを扱う機能を扱っています。

しかし、私はすでに簡単なことで問題を抱えています:

コンパイラエラーが発生しています

ここで私が間違っていることを誰か教えてください。ありがとうございました!

0 投票する
1 に答える
302 参照

memory - マルチスレッド アプリケーションでの MASM dll メモリの割り当て

ここで MASM でメモリを動的に割り当てる方法を尋ねましたが、さらに 2 つの質問がありました。

バイトにメモリを割り当てるにはどうすればよいですか?

2 番目の質問です。マルチスレッド アプリケーションでメモリを割り当てるこの方法を使用できますか、それとも GlobalAlloc を使用する必要がありますか?

0 投票する
1 に答える
298 参照

memory - MASM - HeapAlloc が例外をスローする

また来ました。C# アプリケーションで masm .dll を使用していますが、コードで「System.AccessViolationException」がスローされINVOKE HeapAlloc, edx, 0, <size> ます。問題の原因を教えてください。

これが私のASMコードです: