問題タブ [placement-new]
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++ - 歴史的なコードでの new の異常な使用。どういう意味ですか?
私はいくつかの古いコードを移植しています:
オリジナルは独自の魔法のnew
オペレーターを定義することになっていたようです. この使い方が気になります。
使用例
g++ -E
プリプロセッサの出力を取得するために使用すると、次のようになります。
これはplacement new
.
しかし、これはオーバーロードされた新しい呼び出し (いくつかのファンキーなパラメーター、5 つのパラメーターnew
呼び出し) ですか、それともここのコンマはコンマ演算子であり、したがって("Help")
(意味がありません) に縮小されます。
new
歴史的に (または現在でも) 3 つ以上のパラメーターを持つことが許可されていました(size, hint)
。
デコードに関するヘルプをいただければ幸いです。
c++ - キーと値のペアを動的配列ベースの構造に格納する方法に関するアイデア
次のプロパティを持つ動的配列があります。
- キーと値のペア構造を格納します。
- エントリが追加されるたびにメモリを再割り当てします (realloc)。コンストラクターを呼び出します。
- 削除はトリッキーです - 削除されるエントリは、どこからでも配列の最後に移動する必要があります - その内容 (キーと値) は、配列内の現在の最後の項目と交換する必要があります。デストラクタを呼び出します。エントリが削除されるようにメモリを再割り当てします。
ここでの問題は、最初に参照によって値をエントリに保存したことです。でも、それでは使えませんoperator=
。しかし、値で保存することもできません。そして、ポインターを保存したくありません。これは、目的全体を無効にするためです。現時点で残っている唯一のオプションは、削除されるエントリで新しい配置を呼び出し、最後の要素からコピー コンストラクターを呼び出すことです。これにより、参照によって値を保持できます。何かアドバイス?または、私が注意すべき落とし穴はありますか?
c++ - C++での配置の新しいVS明示的コンストラクター呼び出し
最近、メモリ内の特定の場所にオブジェクトを作成する2つの方法に出くわしました:
1。
2.2。
2番目の方法は少し短いです...他に違いはありますか?よろしくマテウス
c++ - STL コンテナの割り当て配置 新規
この質問に対する正確な答えが見つからなかったため、ここに投稿しました。ベクトルについて考えるとき、連続したメモリ位置にオブジェクトを構築する必要があります。これは、ベクトルが割り当てられたメモリを保持し、それにプッシュされるオブジェクトのインプレース構築 (=placement new) を行う必要があることを意味します。これは有効な仮定ですか?また、これはコンテナーが delete を呼び出すのではなく、手動でデストラクタを呼び出しているということですか? ここで見逃している他の仮定はありますか? これは、私が書くことを選択した場合、オブジェクトのカスタム作成された新しいものでさえ呼び出されない可能性があると想定できることを意味しますか?
また、継続的なメモリ保証が必要ないため、リストで new と delete を使用することも理にかなっています。では、この種の動作は、アロケータの動作を駆動するものですか? 助けてください。ありがとう
c++ - 配置の新しい奇妙な動作
何をしようとしているのか聞かないでください。これは簡単なテストであり、新しい配置に問題があるかどうかを確認することが唯一の目的です。
問題を見つけた、または何かを誤解しただけです。
「#define WORKS」を削除すると、次のようなアクセス違反が発生します
これはうまく機能しますが、
これが破棄段階で例外をスローする原因です。何が起きてる?私は Windows XP で作業しており、VC++ Express 2010 でビルドしています。
c++ - Vector Container で新しい配置を使用する
コンテナがある場合:
オブジェクトがすべて連続して割り当てられるように、placement new を使用してオブジェクトを割り当てることはできますか? 私はこのようなことができるように:
どこsomeRandomeElement
からのランダムな要素でelements
ありelementIndex
、正しいインデックスを格納するsomeRandomElement
ので、elements[elementIndex] == someRandomElement
これは、メモリ マネージャーの現在の実装に必要です。今日完成できた実装がありますが、要素 (ボクセル、三角形など) が GetIndex() および SetIndex() 関数を持つ必要があるため、要素がポインターとして返される場合、配列内の要素のインデックスを見つけることができますelements
。つまり、変更できない要素(Ogre::Vector3としましょう)はマネージャーを使用できません(私の場合、断片化しているため、マネージャーを使用する必要があります想い出)。
私の唯一の他の解決策は、アクセサーとして機能し、インデックスと要素へのポインターを持つ構造を持つことですが、これによりメモリ使用量が増加します (現在 500 万の要素を扱っていることを考慮して)。
注: 今日投稿した同様の質問がありますが、そこにある回答は、私の要件に完全に反するいくつかの仮定を行っています。要件の 1 つは、ベクトルをポインターで満たす必要があること
T
です。そうしないと、コードベースの大部分を変更する必要があります。次に、100,000 (概算) を超える要素を初期化すると、bad_alloc 例外が発生します。各要素のサイズは 196 バイトです (132 バイトに減らすことができました)。
c++ - 新しい配置でオブジェクトの所有権を転送する
コピーできないリソースを管理するクラスを持つVisualStudio2008C++プロジェクトがあります。参照構造による転送セマンティクス(ala std::auto_ptr
)を実装しました。
残念ながら、placement-newを使用するライブラリでこのパターンを使用すると、コンパイラエラーが発生します。
例えば:
Test
新しい配置で使用でき、所有権のセマンティクスを保持できるように変更するにはどうすればよいですか?
ありがとう、PaulH
c++ - デストラクタを直接呼び出した後の「new (this) MyClass();」は未定義の動作ですか?
この私の質問では、@DeadMGは、this
ポインターを介してクラスを再初期化することは未定義の動作であると言います。どこかの規格に言及されていますか?
例:
Ideone での出力例(UB も「一見正しい動作」になる可能性があることはわかっています)。
有効期間が終了したオブジェクトにアクセスしないように、クラスの外部でデストラクタを呼び出さなかったことに注意してください。また、@DeadMG は、コンストラクターごとに 1 回呼び出される限り、デストラクタを直接呼び出すことは問題ないと言っていることに注意してください。
c++ - 演算子 new[] と配置 new と通常の delete[] の混合
好奇心からですが、次は合法ですか?
同様に:
c++ - 配置の新しい演算子を介して構築されたオブジェクトを削除するには?
では、破壊する正しい方法は何t
ですか?
PS 上記のコードは、私の問題を説明するためだけのものであり、これから書くコードとは実際には関係ありません。したがって、次のような回答はしないでください (new
非配置ではなく配置を使用するのはなぜですか? など)。