問題タブ [dynamic-memory-allocation]
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.
c++ - このコードはクラッシュしないはずです
メモリスペースが不足しているため、このコードがクラッシュしないようにする必要があります。pの値、つまりpに配置されているメモリのアドレスを出力してみましたが、増加しているように見えますが、クラッシュは発生していません。
なんでそうなの?
c++ - 膨大な量のデータを格納するためのデータ構造?
私のアプリケーションでは、一連の画像 (MRC 画像) からボリュームデータを読み込み、ピクセル データをメモリに保持する必要があります (画像はグレースケールなので、1 ピクセルあたり 1 バイト)。
私の開発環境は QT フレームワーク、Windows では MinGW、Linux では GCC です。
現時点では、単純なデータ構造を使用してボリュームデータを次のように保存します。
そして、次のように 1 つの巨大な割り当てを行います。
以下は、次のような特定の平面の画像データにアクセスするための重要な方法です。
私の単純なデータ構造では、上記のメソッドを簡単に実装できました。
しかし、将来的には 2000x2000x1000 (~3.7Gb) のボリューム サイズを採用する必要があるかもしれません。現在のデータ構造では、その巨大なデータを処理することはできません。
断片化を避けるには? 現在、1000x1000x200 のデータでも、アプリケーションがクラッシュして bad_alloc が発生します。これのデータ構造を変更する最良の方法は何ですか? 各チャンクのサイズが 100 MB のリンク リストのようなものを使用しますか。
また、ユーザーはボリュームデータに対していくつかの画像処理フィルターを実行できる必要があり、元のピクセル値にリセットできる必要があります。つまり、ボリューム データのコピーを 2 つ保持する必要があります。現在の実装では、そのようなものです。
unsigned char *volumeDataOriginal;
unsigned char *volumeDataCurrent;
したがって、2000x2000x1000 のデータ範囲では、約 8Gb (各ボリュームで 4Gb) を使用します。しかし、Win32 ではアドレス空間が 4GB あります。64ビットアプリケーションを使用する必要がありますか?
編集:これは私のアプリケーションのスナップショットです
基本的に、ボリューム データを (一連の画像から、MRC 形式などから) 読み込み、それらをさまざまな平面ビューアー (XY、YX、YZ。画像は XY 平面ビューアーを示しています) で表示します。上記を維持する必要があります。特定の平面に画像を表示するための 3 つのデータ アクセス方法。ユーザーはスライダー バーを使用して、選択した平面に表示する画像を変更できます)
前もって感謝します。
c - 動的割り当てでパラメーターを参照渡しすることを理解する
C言語でパラメータを参照渡しする方法を理解しようとしています。そこで、パラメーターの受け渡しの動作をテストするために、次のコードを書きました。
ここに印刷されています:
例 2:
それは印刷しました:
この 2 つのプログラムの違いは何ですか?
c++ - Linux の C++ 関数ごとにメモリ使用量ツールが必要
Linux で関数ごとまたは C++ コードの行ごとに (リークだけでなく) メモリ使用量を表示できるランタイム メモリ デバッガーを探しています。プログラムのメモリ使用量の急増を追跡しようとしています。Valgrind と Purify を使用しましたが、リークがないことがわかりました。そのスパイクの後、メモリ使用量がプログラムの予想レベルに戻ると予想していました。
ありがとう。
c - 行列式を計算する再帰プログラムで見つかった最も奇妙なバグ
誰でもこのコードのバグを見つけることができますか? マトリックス nXn の行列式を計算する関数を作成しようとしています。プログラムは正常に実行されますが、「非常に自然な」ことが起こります。タイプ「char」の変数「ch」を宣言しましたが、もう必要ありません。しかし、この変数を削除すると、実行エラーが発生します。なんで?
c - Cでmallocを使用して、typedefされた型にスペースを割り当てます
malloc
関数にスペースを割り当てるための引数として何を使用する必要があるのか正確にはわかりませんtable_allocate(int)
。私はちょうど考えcount_table* cTable = malloc(sizeof(count_table*))
ていましたが、それはサイズパラメータでは何もしません。私list_node_t
もスペースを割り当てることになっていますか?以下は私が取り組んでいるものです。
.hファイルでは、次の署名が与えられています。
これが私が使用することになっている構造体です:
c++ - malloc と new の違い
誰かが以下を修正/編集してください - malloc と new の違い - すべてが正しいかどうかを確認してください。ありがとうございました、
malloc
との両方new
が動的メモリ割り当てに使用されます。
malloc
は C 関数ですnew
が、 は C++ 演算子です。
malloc
メモリを動的に割り当てる場合は特別な型キャストがnew
必要ですが、型キャストは必要ありません。
メモリの割り当てに使用するときはいつでもnew
、必要なコンストラクターも呼び出しますが、それmalloc
は行いません。
malloc
NULL
メモリが使い果たされた場合、失敗してポインターを返す可能性がありますnew
が、NULL ポインターを返すことはありませんが、代わりに例外をスローすることで失敗を示します。
を使用している間malloc
、free
割り当てられたメモリを解放するために使用される C 関数です。
を使用している間new
、delete
割り当てられたメモリを解放し、必要なデストラクタを呼び出すために使用される C++ 演算子です。
c++ - メモリのセグメントを「範囲外」としてマークして、ヒープ マネージャがそこから割り当てないようにすることは可能ですか?
今日、私はこの質問をしました。
この問題の調査に時間を費やした後、何が起こっているのかを発見しました。別の問題として追跡するのに十分興味深いと思うので、これを新しい質問として投稿しています。その質問を回答(およびこれへのリンク)で更新します。
デバッガーからの単体テストの起動
コマンドラインから単体テストを起動する
要約すれば:
- コマンド ラインから単体テストを起動すると、 (新しいものを割り当てる前に前のものを)
new
を割り当てるための後続の呼び出しは、常にメモリ内の同じアドレスを返します。Object
delete
Object
- デバッガーから単体テストを起動すると、 (新しいものを割り当てる前に前のものを)
new
を割り当てるための後続の呼び出しは、常にメモリ内の一意のアドレスを返します。Object
delete
Object
問題は、コマンド ラインから起動すると、 の割り当ては常にメモリ内で同じアドレスを取得するため、古いObject
ポインターを格納しているアクセス中のマップを引き続き使用でき、テストがクラッシュしないことです。しかし、欠陥の修正が行われていないときに単体テストをクラッシュさせて、黙って失敗したり、欠陥が再発したりしないようにしたいと考えています。
私の質問には2つの部分があります:
コマンド ラインから単体テストを起動すると、ヒープ マネージャーがメモリの同じ部分を再利用するのに、デバッガーから単体テストを起動すると再利用しないのはなぜですか?
単体テストを正しく記述できるようにするために、テスト ハーネスで使用できるコンパイラ設定、または削除したメモリのセクションをヒープ マネージャーが再利用するのを防ぐために呼び出すことができるメソッドはありますか? 1
1明らかにこれを行う 1 つの方法は、元のオブジェクトを削除しないことですが、これを割り当てるコードの一部は私の運用コードにあり、これを行うとメモリ リークが発生します。
c++ - 参照とポインタの違いは何ですか?
誰かが私に違いを非常に小さな言葉で説明してもらえますか?私はこれを理解したことがなく、現在のプロジェクトで非常に混乱しています。私がやろうとしているのは、このコードを修正することです。
これで、コンパイラはこれがローカル変数への参照であると教えてくれますが、参照とはどういうわけか異なるため、ポインタに戻ることはできません。そして、抽象クラスのオブジェクトへの参照またはポインターを保持することになっているセットクラスにも取り組んでいます。私は完全に混乱しています。どんな助けでも大歓迎です。
c++ - この関数がセグフォールトしているのはなぜですか?
関数は次のとおりです。
変数setArrayは、私のヘッダーでMultinumber**型であると宣言されています
私がこれでそれを呼ぶときはいつでもそれはsegfaultsです:
c4とc5は、適切なタイプのオブジェクトへのポインタとしてすでに宣言されています。
どんな助けでも大歓迎です。
編集:以下のコードはaddElement関数です(インデントの謝罪)
編集:多数のcoutステートメントに基づいて、エラーはこの関数にあるようです:
編集:配列インデックスを変更しましたが、それでもsegfaults