問題タブ [dynamic-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 - 動的に割り当てられたブロックの一部を解放しますか?
プログラマーが割り当てられたブロックの一部を解放できるようにする動的メモリ割り当てシステムが存在するかどうかに興味がありました。
例えば:
これが賢明/賢明でない/難しい理由についての考えは? これを行う方法は?
私にはそれが役に立ちそうな気がします。
ありがとう!
=====編集===== いくつかの調査の結果、Linux カーネルの bootmem アロケータは、bootmem_free 呼び出しでこの操作と同様のことを許可しているようです。それで、私は興味があります.bootmemアロケーターがこれを許可するのに、ANSI Cは許可しないのはなぜですか?
c++ - vector の push_back が malloc で失敗し、さらにメモリを割り当てることができない
への呼び出しがpush_back
失敗するコードがあります。mdb から、次の手がかりが得られます。
::dem malloc+0x49~ malloc+0x49~ == malloc+0x49~ ::dem __1cIallocate4CpnGrnc_JO__6FipTA_3_+0x2a~ __1cIallocate4CpnGrnc_JO__6FipTA_3_+0x2a~ == __type_0*allocate ::dem __1cJallocator4CpnGrnc_JO__Iallocate6MI_p1_+0x20~ __1cJallocator4CpnGrnc_JO__Iallocate6MI_p1_+0x20~ == rnc_JO**allocator ::allocate ::dem __1cGvector4CpnGrnc_JO__Kinsert_aux6Mp1rk1_v_+0xac __1cGvector4CpnGrnc_JO__Kinsert_aux6Mp1rk1_v_+0xac == void vector::insert_aux ::dem __1cGvector4CpnGrnc_JO__Jpush_back6Mrk1_v_+0x4e __1cGvector4CpnGrnc_JO__Jpush_back6Mrk1_v_+0x4e == void vector::push_back ::dem __1cIallocate4CpnGrnc_JO__6FipTA_3_+0x2a __1cIallocate4CpnGrnc_JO__6FipTA_3_+0x2a == __type_0*allocate : :dem __1cGvector4CpnGrnc_JO__Jpush_back6Mrk1_v_+0x4e __1cGvector4CpnGrnc_JO__Jpush_back6Mrk1_v_+0x4e == 空ベクトル::push_back`
どうすれば修正できますか?私が知っていることは、実際にはベクトルサイズよりも大きい割り当てられたスペースがあることです。そのスペースが使用されると、すべてのデータが再割り当てされ、2 番目の場所にコピーされます。
vector は非常に大きな値であることも知っていmacx_size
ますが、これは私のコードでは失敗しないはずです。それほど多くの値を挿入していないからです。何のためにデバッグする必要があるか教えていただけますか?
c++ - ファイルの長さに応じた可変長配列 C++
任意のサイズの問題に対してアルゴリズムを一般化しようとして問題が発生しています。コードは私が使用したテスト問題に対して機能していますが、いくつかの配列の長さを手動で挿入する必要がありました。次に、入力ファイルの長さを 2 つの変数で読み取ろうとしましたが、すべてのコードでそれらを使用することはできず、いくつかの部分でしか使用できません。ばかげていると思いますが、私は C++ にまったく慣れていないので、助けてもらいたいと思っています。コードの一部は次のとおりです。
ご覧のとおり、main() では、入力ファイルの長さを cont_prod 変数と cont_slot 変数にカウントしていますが、変数宣言ではそれらを使用できません。必要な可変長配列はグローバル変数でなければなりません。他の関数でもそれらが必要だからです。また、cont_prod と cont_slot は、一部の関数のローカル変数宣言で必要になるため、グローバルである必要があります。これらを使用する必要がある関数の 1 つを次に示します。
111 は cont_prod で、360 は cont_slot です。私は Xcode で Mac でプログラミングしていますが、可変長配列はファイル スコープで宣言できないと書かれています。これは、グローバル変数を意味していると思います。どうすればそれを管理できますか?
c++ - 動的構造エラー、ポインター変換
構造体のコンストラクターでこのエラーが発生します。**ではなく*ポインターでのみ動作するので、なぜ取得するのですか。
エラー:
構造体.h
構造体.cpp
c++ - オブジェクトの配列を関数に渡そうとするとエラーが発生する
私はの配列を渡そうとしていますStudent
関数にprocessStudent(string myFilename, Student* myArray, int &mySize)
。しかし、それは私に別の種類のエラーを与えています。
Student()は何もしませんが、ある種の値を割り当てようとしましたが、それでもまったく同じエラーメッセージが表示されます。
主に私はこれを持っています:
関数は次のようになります。
//クラスStudentのcppファイル内
エラーメッセージ:
私は自分のコードを削除してきましたが、このエラーは消えません。この配列を作成し、それをprocessStudent関数に渡して、ファイルを読み取るときにそれぞれを設定できるようにします。
c - Cで静的変数と自動変数をfree()できますか?
コードは次のとおりです。
上記のコードをコンパイルしようとすると動作しますが、このfree()
関数で静的変数と自動変数の両方を解放できるのでしょうか?それとも基本的に何もしませんか?
php - 共通のプレフィックスを持つ動的に名前が付けられた配列に対する単一の foreach ループステートメント?
スクリプトで動的な名前の配列を作成しています。この方法で作成されたすべての配列には、番号が追加されます。
例: $group1、$group2、$group3、$group4、$group5、$group6、$group7、$group8
配列の数が正確にわかっている (そしてスクリプトが理解している) 場合 (そして、その結果、すべてのアペンションがわかる)、それらの 8 つすべてを通過することを理解する単一のステートメントを実行する方法があるかどうか疑問に思っていました。 8 つの別々のループを呼び出すことなく、配列を使用できます。
コードのこの部分を多次元配列を使用するように書き直す方がおそらくはるかに優れていると思いますが、かなり前にこの情報を使用して他の関数をいくつか書きました。プロジェクト。このプロジェクトは個人的な目的でのみ使用されることに注意してください。
より良い例を挙げると、このようなことは可能ですか?
c++ - このアルゴリズムでは、動的領域割り当ては実際にどのように機能しますか?
テンプレートを使用して、動的に割り当てられた配列を学校の目的で独自に作成しました。
私が尋ねようとしていることは機能しますが、その方法と理由がわかりません。知る必要があるところまで来ました。
知っておく必要があります:TElement *auxArray = myArray;
これはどのように機能しますか? ポインタを使用していますか、要素は1つずつコピーされていますか? アルゴリズムの複雑さを理解できるように、それがどのように機能するかを理解する必要があります。誰かが私に複雑さを教えてもかまいませんが、私が探している本当の答えはそれがどのように機能するかです?
また、古いものmyArray = new TElement[capacity];
を削除する前にこれを行いますが、古いものは削除さmyArray
れますか? それとも、何らかの形でメモリのどこかにまだ浮かんでいますか?
c++ - 動的文字列のサイズを変更すると、メモリリークが発生します
私は非常に単純なプログラムから始めます:
tb::String
char
文字列とwchar_t
(Unicode)文字列の両方を処理するように設計された私自身の文字列クラスです。これは高度にテンプレート化されてtb::String
おり、のtypedefですtb::StringBase<char>
。
CRTデバッグユーティリティを使用してすべてをコンパイルし、メモリリークをチェックします。出力は次のとおりです。
したがって、空のtb :: String(サイズ0)がメモリリークを引き起こしているように見えます。リークしないこのプログラムで確認:
元のプログラムのコールスタック:
StringBase<char>
文字列を使用してを作成します""
。m_Length
0に設定されます。m_Maximum
m_Length + 1
(1)に設定されます。m_Data
m_Maximum
(1)の長さで作成されます。m_Data
クリアされ、で埋められ""
ます。_AppendSingle
に設定されStringBase<char>::_AppendDynSingle
ます。- オーバーロードされた演算子
StringBase<char>::operator =
は文字列で呼び出されます"Hello World!"
_AppendSingle
と呼ばれます。m_Length
は0、m_Maximum
は1です。checklen
m_Length + src_len + 1
(13)に設定されます。m_Maximum
checklen
(16)より大きくなるまで2を掛けます。StringBase<char>::Resize
関数は新しい最大値で呼び出されます。
サイズ変更機能:
これが問題だと私は思う。今、私の質問は次のようになります:
CRTデバッガーでメモリリークをトリガーせずに、C ++でメモリを再割り当てするにはどうすればよいですか?
コンストラクタ:
デストラクタ:
代入演算子:
追加機能:
注意:私は使用したくない、std::string
またはstd::vector
、この機能を修正したい。