問題タブ [realloc]

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

c - CReallocエラー-「アサーション`ptr== alloc_last_block'が失敗しました!」

リンクリストと述語を受け取り、この条件を満たすリンクリストのすべての値を含む配列を返す関数をCで記述しています。関数は次のとおりです。

常に1を返す述語(つまり、get_all_thatは基本的にto_array)を渡しましたが、i=4の反復でスター付きの行でエラーが発生します。バックトレース(SIGABRTから自動的に出力された)のエラーは、「*** glibcが検出されました***〜/ list / test:realloc():invalid next size:0x0804c0e8***」です。

GDBを開いて、i=4のときにreallocを呼び出す直前に中断するように指示しました。次に、GDBから手動でrealloc(vals、i * vps)を呼び出そうとすると、次のエラーメッセージが表示されました。

誰が何が起こっているのか知っていますか?

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

c++ - realloc の置き換え (C --> C++)

以前の質問で、ポインターの型キャストについて尋ねましたが、malloc の代わりに C++ 割り当てシステムを使用するというより良い解決策に向けられました。(一部の C コードを C++ に変換しています)

ただし、同様の機能にはまだ問題があります。

私が変更され:

ただし、次の関数で realloc を使用するにはどうすればよいですか。

次のエラーが表示されます。

編集2:

さて、私が得ているコンセンサスは、現在のソリューションを捨てる必要があるということです (私はそれを行うことにオープンです)。

私が正しく理解していることを確認するために、オブジェクトへのポインターの配列の代わりに、オブジェクト自体を含むベクトルが必要なのですか?

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

c - 1つの大きなmallocと複数の小さなrealloc

申し訳ありませんが、これまでに質問されたことがありますが、探しているものを見つけることができませんでした。

リストからフィールドを読み取り、それらをメモリのブロックに書き込んでいます。私はできた

  • リスト全体を歩き、必要な合計サイズを見つけ、1つ実行してmallocから、リストをもう一度歩き、各フィールドをコピーします。
  • realloc値を書き込むときに、リスト全体とメモリのブロックをウォークします。

今のところ、最初のものが私にとって最も効率的だと思われます(呼び出しの数が最も少ない)。どちらのアプローチの長所と短所は何ですか?

お時間をいただきありがとうございます。

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

c - C 構造体の配列により多くのスペースを割り当てるにはどうすればよいですか?

固定サイズ 20 で既に malloc されている構造体に、さらに 10 個の要素を追加しようとしています。これが、構造体を定義する方法です。

だから私が念頭に置いていたのは、次のように再割り当てすることでした(ただし、方法はわかりません):

余分な10個の要素を追加し、

どうすればこれを達成できますか?どんな助けでも大歓迎です!

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

c - C で realloc 関数を使用したメモリ割り当ての問題

この機能に問題があります。この関数は、必要に応じて配列「music」のサイズを再割り当てします。しかし、ループ内でこの関数を何度も呼び出そうとすると、実行エラーが発生しました。おそらくメモリ割り当ての問題ですが、これを理解することはできません。

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

c++ - C++でreallocを使用する

std::reallocmallocされたメモリにポッド以外のタイプが含まれている場合、C++では危険です。唯一の問題は、std::reallocメモリをその場で拡張できない場合に型デストラクタを呼び出さないことです。

ささいな回避策はtry_realloc関数です。in situで拡張できない場合、新しいメモリをmallocする代わりに、単にfalseを返します。この場合、新しいメモリを割り当てることができ、オブジェクトは新しいメモリにコピー(または移動)され、最後に古いメモリが解放されます。

これは非常に便利なようです。 std::vectorこれを大いに活用して、すべてのコピー/再割り当てを回避できる可能性があります。
プリエンプティブ難燃剤:技術的には、これはBig-Oのパフォーマンスと同じですが、ベクトルの成長がアプリケーションのボトルネックである場合、Big-Oが変更されていない場合でも、2倍のスピードアップが最適です。

しかし、のように機能するcapiが見つかりませんtry_realloc

私は何かが足りないのですか?私try_reallocが想像するほど役に立たないのですか?使用できなくなる隠れたバグはありtry_reallocますか?

さらに良いことに、次のように機能する、文書化されていないAPIはありますtry_reallocか?

注:私は明らかに、ここのライブラリ/プラットフォーム固有のコードにいます。try_realloc本質的に最適化であるため、私は心配していません。


更新:vector reallocを使用する方が効率的 かどうかについてのSteve Jessopsのコメントに続いて、テストする概念実証を作成しました。はrealloc-vectorベクトルの成長パターンをシミュレートしますが、代わりに再割り当てするオプションがあります。ベクトル内の最大100万要素までプログラムを実行しました。

比較のためvectorに、100万要素に成長しながら19回割り当てる必要があります。

結果は、ヒープを使用する唯一のものである場合、realloc-vector結果は素晴らしいものであり、100万バイトのサイズに成長しながら3〜4の割り当てが行われます。

を66%の速度で成長するrealloc-vectoraと一緒に使用すると、結果 はあまり期待できず、成長中に8〜10回割り当てられます。vectorrealloc-vector

最後に、が同じ速度で成長するrealloc-vectoraと一緒に使用される場合、は17〜18回割り当てられます。標準のベクトル動作よりも1つの割り当てをほとんど節約できません。vectorrealloc-vector

ハッカーが節約を改善するために割り当てサイズをゲームできることは間違いありませんが、そのようなアロケータを作成して維持するための多大な努力は利益をもたらさないというスティーブに同意します。

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

c - 動的メモリ: malloc と realloc

私は C を初めて使用し、動的メモリの使用に問題があります。構造体の図を malloc してから、必要に応じて再割り当てします。コードをデバッグしようとしていたときに、ddd の助けを借りて、1 つの図を前の図に上書きしていることに気付きました (提供したコードの 2 番目のチャンクで、変数の名前は figureHere です)。誰かが私の愚かな間違いの理由を見ることができるなら、私に知らせてください.

コードの最初のチャンクは、2 番目のチャンクで void を呼び出します。



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

c - glibc が検出されました。realloc(): 無効なポインター

長いコードで申し訳ありません。簡単な質問がありますが、どこから来たのかが明確になるように、コードを含めると思いました。再割り当ての破損が発生します。破損は、正しく解放していないためだと思います。実際には、glibc が何を言っているのか、何を意味しているのかさえわかりません。誰かが私にそれを簡単に説明できますか? 長いコードで申し訳ありません。





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

c - realloc内のrealloc

Cでは、realloc内にreallocを含めることができますか?たとえば、両方をmallocし、両方を再割り当てする必要がある場合の構造体内の構造体。はいの場合、誰かが簡単な例を提供できますか?前もって感謝します。

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

c - realloc が大量のメモリを消費するのはなぜですか?

この質問は、ソースコードが原因で少し長くなります。ソースコードはできるだけ単純化しようとしました。ご容赦ください。一緒に読んでくれてありがとう。

何百万回も実行される可能性のあるループを持つアプリケーションがあります。mallocそのループ内で数千から数百万の/呼び出しの代わりに、最初に1 つ、次に数千から数百万の呼び出しfreeを実行したいと考えています。mallocrealloc

しかし、私が使用しているときに、アプリケーションが数 GB のメモリを消費し、それ自体を強制終了するという問題が発生していますrealloc。を使用するmallocと、メモリ使用量は問題ありません。

の memtestを使用して小規模なテスト データ セットを実行すると、またはvalgrindのいずれでもメモリ リークは報告されません。mallocrealloc

すべてのmalloc-ed (およびrealloc-ed) オブジェクトと対応するfree.

したがって、理論的には、メモリリークはしていませんrealloc。使用可能なRAMをすべて消費しているように見えるだけです。その理由とこれを修正するためにできることを知りたいです。

私が最初に持っているのは、次のようなもので、malloc適切に使用および機能します。

マロックコード

これはうまくいきます。しかし、私はもっと速いものが欲しいです。

reallocここで、配置をテストします。これはmalloc-s が 1 回だけです。

再割り当てコード

free -m100 万ループ状態を引き起こす大規模なデータ セットを使用してこの ベースのテストを実行しているときに、コマンド ラインで の出力を見るとrealloc、メモリが 4 GB から 0 に減少し、アプリがクラッシュします。

reallocこれを引き起こしている使用について何が欠けていますか? ばかげた質問で申し訳ありませんが、アドバイスをよろしくお願いします。