問題タブ [malloc]

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 投票する
11 に答える
7029 参照

c - C コードで OOM (メモリ不足) エラーを検出する必要がありますか?

私は C コードの多くの行をクリーンアップ ラベル/条件付きメモリ割り当ての失敗に費やしました (allocファミリーが を返すことで示されますNULL)。これは、メモリ障害が発生した場合に適切なエラー ステータスにフラグを立て、呼び出し元が「適切なメモリ クリーンアップ」を実行して再試行できるようにするための優れた方法であると教えられました。私は今、この哲学についていくつかの疑問を抱いており、それを解決したいと思っています.

I guess it's possible that a caller could deallocate excessive buffer space or strip relational objects of their data, but I find the caller rarely has the capability (or is at the appropriate level of abstraction) to do so. Also, early-returning from the called function without side effects is often non-trivial.

I also just discovered the Linux OOM killer, which seems to make these efforts totally pointless on my primary development platform.

By default, Linux follows an optimistic memory allocation strategy. This means that when malloc() returns non-NULL there is no guarantee that the memory really is available. This is a really bad bug. In case it turns out that the system is out of memory, one or more processes will be killed by the infamous OOM killer.

I figure there are probably other platforms out there that follow the same principle. Is there something pragmatic that makes checking for OOM conditions worthwhile?

0 投票する
5 に答える
976 参照

c - 関数内からの再割り当て

ball という構造体、いくつかのボール、ボールの配列、および配列に新しいボールを追加する関数があります。

構造体:

(非動作機能):

および main 内の関数呼び出し:

関数の呼び出しが失敗し、次のエラー メッセージが表示されます。

何か助けはありますか?

それは役に立ちました。これでコンパイルできますが、実行時にセグメンテーション違反エラーが発生します。興味がある場合は、完全なコードを次に示します。

0 投票する
7 に答える
95668 参照

c++ - C++の「new」と「malloc」および「calloc」の違いは何ですか?

new「 」と「malloc」と「 」と「 」と「 」の違いは何callocですか?

(いつ) 「 」以外に何か必要newですか?

それらの1つは他のものを使用して実装されていますか?

0 投票する
9 に答える
9575 参照

c++ - New の代わりに Malloc を使用する場合

重複:どのような場合に malloc と new を使用しますか?

この質問を読み直してください:
C++ の "new" と "malloc" と "calloc" の違いは何ですか?

私は答えをチェックしましたが、誰も質問に答えませんでした:

  • new の代わりに malloc を使用するのはいつですか?

理由はいくつかあります(2つ考えられます)。
一番上に浮かび上がらせてください。

0 投票する
9 に答える
12166 参照

windows - 64 ビットの大きな malloc

特に 64 ビットで malloc() が失敗する理由は何ですか?

私の特定の問題は、64ビットシステムで10GBの巨大なRAMチャンクをmallocしようとすることです。マシンには 12 GB の RAM と 32 GB のスワップがあります。はい、malloc は極端ですが、なぜそれが問題になるのでしょうか? これは、Intel コンパイラと MSFT コンパイラの両方を使用する Windows XP64 にあります。malloc は成功する場合もあれば、失敗する場合もあり、約 50% です。8GB の malloc は常に機能し、20GB の malloc は常に失敗します。malloc が失敗した場合、プロセスを終了して新しいプロセスを再度開始しない限り、繰り返されるリクエストは機能しません (その後、50% の成功が得られます)。他の大きなアプリは実行されていません。新たに再起動した直後でも発生します。

リクエストに割り当てるのに十分な大きさのアドレス範囲がないように、利用可能な 32 (または 31) ビットのアドレス空間を使い果たした場合、malloc が 32 ビットで失敗することを想像できます。

物理 RAMとハード ドライブのスワップ スペースを使い果たした場合、malloc が失敗することも想像できます。これは私には当てはまりません。

しかし、他の理由で malloc が失敗する可能性があるのはなぜでしょうか? 他の理由は思いつきません。

私は、特定の例よりも一般的な malloc の質問に興味があります。いずれにせよ、メモリ マップされたファイルに置き換える可能性があります。失敗した malloc() は、何よりもパズルのようなものです...ツールを理解し、基本に驚かないことを望んでいます。

0 投票する
8 に答える
1522 参照

c - "char bigchar[ 1u << 31 - 1 ];" の場合に malloc() を使用する理由 うまく動作しますか?

静的配列よりも malloc を使用する利点は何ですか?(失敗時に NULL を返す以外に)? 次のプログラムは、ループがコメント解除されている場合にのみ、すべての RAM を使い果たし、スワップの充填を開始します。クラッシュしません。

...

...

いくつかの試行錯誤の後、上記が GCC 4.3 を搭載した 32 ビット Intel マシンで許可されている最大の静的配列であることがわかりました。これは標準の制限ですか、コンパイラの制限ですか、それともマシンの制限ですか? どうやら、私はそれらを好きなだけ持つことができます。それはセグメンテーション違反になりますが、とにかくmallocが私に与えるよりも多くを求めた(そして使用しようとした)場合に限ります。

静的配列が実際に割り当てられ、安全に使用できるかどうかを判断する方法はありますか?

編集: 仮想メモリ システムにヒープを処理させるのではなく、malloc を使用してヒープを管理する理由に興味があります。どうやら、配列のサイズを必要と思われるサイズの何倍にもすることができ、仮想メモリシステムは必要なものだけをRAMに保持します。たとえば、これらの巨大な配列の末尾 (または先頭) に書き込みを行わない場合、プログラムは物理メモリを使用しません。さらに、すべての場所に書き込むことができる場合、ヒープ内のポインターをインクリメントしたり、同じプロセスで以前の割り当てを検索したりする以外に、malloc は何をしますか?

編集者注: int が 32 ビットの場合1 << 31 、未定義の動作が発生1uするため、質問を read に変更しました。質問の意図は、大きな静的バッファの割り当てについて尋ねることです。

0 投票する
4 に答える
377 参照

c - ucharのシミュレートされたメモリ配列内のInt

Cでは、Unix環境(Plan9)で、メモリとして配列を取得しました。

その配列には、空きメモリと使用可能なメモリのサイズを示すint(整数)などのさまざまなフィールドを含める必要があります。だから、私はこれを試しました:

intのサイズが4であることを知っているので、キャストなどで強制する必要があります。この場合、memの最初の4つのスロットのコンテンツの数は250で、ビッグエンディアンです。

しかし、問題は、私が説明したことをやろうとすると、うまくいかないことです。型の変換に間違いがあると思います。うまくいけば、mem[0]からmem[3]にサイズが示され、intとして表され、ucharとして表されないようにするにはどうすればよいでしょうか。

前もって感謝します

0 投票する
8 に答える
578 参照

c - 2 バイトの malloc で問題が発生する

次のような短いmallocを使用しようとしています

私は数日間デバッグしていますが、無知です。

注(編集済み): Linux、および gcc バージョン 3.4.6 20060404


VALGRIND を使用して見つかった問題

しかし、それから、私の仲間の開発者がそのような状況を認識できるように、ここに文書化したいと思います...

私は実際に構造を次のように定義しました

そして、私が定義したコードの他の場所

そのため、sizeof (ALBUM) は typedef ではなく #define 値を参照していたため、問題が発生しました。

私を驚かせるのは、

これはCで許可されていますか?


0 投票する
12 に答える
68687 参照

c - mallocはスレッドセーフですか?

関数はmalloc()再入可能ですか?

0 投票する
4 に答える
11688 参照

windows - Windowsのmallocの置き換え(tcmallocなど)と動的なcrtリンク

複数のDLLとQTを使用するC++プログラムには、Windowsのmallocが原因であることが確認できるパフォーマンスの問題のために、mallocの置換( tcmallocなど)を装備する必要があります。Linuxの場合は問題ありませんが、Windowsの場合はいくつかのアプローチがあり、どれも魅力的ではありません。

1.新しいmallocをlibに入れ、最初にリンクするようにします(その他のSO-質問)

これには欠点があります。たとえば、strdupは古いmallocを引き続き使用し、freeはプログラムをクラッシュさせる可能性があります。

2. lib.exe(Chrome)を使用して静的libcrtライブラリからmallocを削除します

これはクロム/クロムについてテスト/使用(?)されていますが、crtの静的リンクでのみ機能するという欠点があります。静的リンクには、1つのシステムライブラリがmsvcrtに対して動的にリンクされている場合に問題があり、ヒープの割り当て/割り当て解除に不一致がある可能性があります。私が正しく理解していれば、tcmallocは動的にリンクされ、すべての自己コンパイルされたdllに共通のヒープが存在する可能性があります(これは良いことです)。

3.パッチcrt-ソースコード(firefox)

Firefoxのjemallocは、明らかにWindows CRTソースコードにパッチを適用し、新しいcrtを構築します。これにも、上記の静的/動的リンクの問題があります。

これを使用して動的MSVCRTを生成することも考えられますが、ライセンスでは同じ名前のパッチが適用されたMSVCRTを提供することが禁止されているため、これは不可能だと思います。

4.実行時にロードされたCRTに動的にパッチを適用します

一部の商用メモリアロケータは、そのような魔法を実行できます。tcmallocでも可能ですが、これはかなり醜いようです。いくつかの問題がありましたが、修正されました。現在、tcmallocでは、64ビットウィンドウでは機能しません。

より良いアプローチはありますか?コメントはありますか?