問題タブ [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++ - 内部配置が新しいクラスのセーフコピーコンストラクターを実装する方法(std :: stringを使用)
これが私のコードです:
std::stringが内部的に割り当てられている場合を適切に処理するコピーコンストラクターを追加する方法に関する提案をいただければ幸いです。
c++ - 新しい配置で割り当てられたポインターの呼び出しを削除できますか?
配置delete
で割り当てられたポインタを呼び出すことはできますか?いいえの場合、なぜですか?詳しく説明してください。new
プレースメントの削除がないことを知っています。しかし、なぜポインタを削除するだけでは、ポインタが指すメモリがどのように割り当てられているかを気にせずにメモリを削除できないのでしょうか。
delete
2つのことをしています:
- destrucorを呼び出す
- メモリを解放します
そして、新しい配置によって作成されたオブジェクトに対して、これら2つの操作のいずれも呼び出せないという削除の理由はわかりません。理由について何か考えはありますか?
c++ - operator =で配置new(this)を使用できますか?
背景: 私は多くの変数を持つ複雑なクラスを持っています。私は健全でテスト済みのコピーコンストラクターを持っています:
初期化リストで呼び出されるメンバー変数コピーコンストラクターの一部は、割り当てを実行します。
質問:
を作成する必要がありますoperator=
。初期化リストの代わりに代入を使用して既存のコンストラクターを複製したり、置き換えられるメモリを解放したりするのではなく、次のようにすることができます。
言い換えると、destroy selfの後に、operator =と意味的に同一の配置新しいコピーコンストラクターが続きますか?
これにより、繰り返しコードが大幅に削減され、各変数が適切に初期化されていることを確認できる可能性がありますが、割り当て中に効率がわずかに低下する可能性があります。もっとあいまいなものが欠けていますか?
理論的根拠: 私の実際のクラスには約30の変数があります。コピーコンストラクターと代入演算子の両方が30個すべてをコピーする必要があり、コードが分岐して2つの操作の動作が異なる可能性があるという事実を懸念しています。
java - C ++の配置新しい演算子とは何ですか?Javaにはそれがありますか?
C++の配置構文について聞いたことがあります。私はそれが何であるか混乱しています。ただし、stackoverflowの質問の下でどこで使用できるかはわかります。これがJavaにあるかどうかも混乱しています。だから私の質問は非常に正確です:配置の新しい演算子とは何ですか?Javaでそれのようなものがありますか?
スタックオーバーフローに関する他の質問と混同しないでください。これらはこの質問と重複していません。
c++ - このハックはエイリアシング警告UBを削除しますか?
コンパイラをgcc4.6にアップグレードしたところ、これらの警告がいくつか表示されます。現時点では、コードベースはc ++ 0xでコンパイルできる状態ではなく、とにかく、これをprodで実行したくないので(少なくともまだ)、この警告を削除するための修正が必要でした。
警告は通常、次のような理由で発生します。
後で、これは次のように使用されます
たとえば、読んだり、更新したり、戻ったりするには、次のキャストが発生していました
これは4.4で問題ありませんでした。4.6では、上記は以下を生成します。
警告:型のパンニングされたポインタは厳密なエイリアスルールに違反します
このエラーを取り除くためのクリーンな方法は、を使用することですがunion
、前述のように、c ++ 0x(したがって無制限のユニオン)を使用できないため、以下の恐ろしいハックを採用しました-警告はなくなりました、しかし私は鼻のデーモンを呼び出す可能性がありますか?
これは問題なく機能しているように見え(ここの簡単な例を参照:http ://www.ideone.com/9p3MS )、警告は生成されません。これはc ++ 0xまで使用しても問題ありませんか(様式的な意味ではありません)。
注:私は一般的に使用したくない-fno-strict-aliasing
...
編集:私は間違っていたようです、同じ警告が4.4にあります、私たちは最近これを変更しただけだと思います(コンパイラの問題である可能性は常に低いです)、しかし問題はまだ残っています。
編集:さらなる調査により、いくつかの興味深い情報が得られました。コードが次のように2行に分割されている場合、キャストを実行してメンバー関数を1行で呼び出すことが、警告の原因であるようです。
これは実際には警告を生成しません。その結果、ideoneの簡単な例に欠陥があり、さらに重要なことに、上記のハックでは警告が修正されません。修正する唯一の方法は、キャストから関数呼び出しを分割することです。キャストはとして残すことができますreinterpret_cast
。
c++ - 同じアドレスで複数回配置することは明確に定義されていますか/合法ですか?
(注:この質問は、この他の質問に答えるためのノーオペレーション割り当てを生成するためにプリプロセッサハッカーを考え出すことによって動機付けられました:
...それを覚えておいてください!)
考案されたクラスは次のとおりです。
...これを次のように割り当てます:
私が持っているgccで、「期待される」結果が得られます。
これは素晴らしいことですが、コンパイラ/ランタイムはこれを悪用として拒否し、それでも仕様の右側にある可能性がありますか?
糸脱毛はどうですか?このクラスの内容を実際に気にしない場合(とにかくダミーオブジェクトであるとしましょう)、POD intでこれを動機付けたさらに単純なアプリケーションのように、少なくともクラッシュすることはありませんか?
c++ - 新しい配置は const と参照を壊しますか?
次のコードは許可されています
ただし、次のコードは許可されていません
$3.8/7のため
オブジェクトの有効期間が終了した後、オブジェクトが占有していたストレージが再利用または解放される前に、元のオブジェクトが占有していたストレージの場所に新しいオブジェクトが作成された場合、元のオブジェクトを指すポインタ、その参照または、元のオブジェクトの名前が自動的に新しいオブジェクトを参照し、新しいオブジェクトの有効期間が開始されると、新しいオブジェクトを操作するために使用できます。
- 元のオブジェクトの型が const 修飾されておらず、クラス型の場合、型が const 修飾されているか参照型である非静的データ メンバーが含まれていない...
f.x
f が存在しなくなったときにへの参照を無効にする方法は理解できますf_ref
が、そのメンバーの 1 つが const および/または参照であり、それ以外ではないという理由だけで無効にする必要があるFoo
理由がわかりません。Foo
その後への参照です。
誰かがこの状態の背後にある理論的根拠を説明できますか?
編集
答えてくれてありがとう。現在、オプティマイザーがリファランドをキャッシュすることを許可していないため、「変更されないことを保証する」という引数は購入しません。次に例を示します。
do_it
参照された値を無効にする方法がわかりませんが、そうoperator new
ではありません -- シーケンス ポイントはキャッシュされた値を無効にします。delete/placement-new を除外する必要があるのはなぜですか?
c++ - new、malloc、およびfreeの配置を使用する
基本的に、mallocを使用して割り当てられたメモリのブロックがあり、新しい配置を使用してオブジェクトの配置を開始します。これらのオブジェクトを削除するときは、これらのオブジェクトのデストラクタを明示的に呼び出す必要があることはわかっていますが、これを完全に理解し、正しい方法で実行していることを確認したいと思います。私はほぼ間違いなくこのアプローチを廃止し、より簡単な方法で物事を進めるつもりですが、理解のためだけにお願いしたいと思いました。
次のプライベートメンバー変数を含むクラスWordIndexがあります。
メモリはmalloc/reallocを使用して両方のポインターに割り当て/再割り当てされ、オブジェクトは次のコードを使用して作成されます(既存のオブジェクトを上書きしません)。
私は次のようなデストラクタを持っていますが、実行時にエラーが表示されないにもかかわらず、正しく実行されていないことはほぼ100%確信しています。
私の質問は次のとおりです。
- Word構造体にベクトルがあることを考えると、単に〜Wordを呼び出すだけで十分ですか、それとも事前にベクトルのデストラクタを個別に呼び出す必要がありますか?
- 文字列(m_linesとWord.wordの両方)のデストラクタを呼び出す必要がありますか?そうであれば、どうすればよいですか?呼び出すことができる〜stringのような関数がないようです。
- 私は他に何かを逃したことがありますか?私は持っているとかなり確信しています。
前もって感謝します!
c++ - 新しい配置で真の基本クラスの構築を遅らせる
私は、次のアプローチが a) 合法であり、b) 道徳的であるかどうか (およびその理由) を尋ねています。C++03 に重点を置いて質問していますが、C++11 に関するメモも歓迎します。アイデアは、それ自体がデフォルトで構築可能である可能性のある派生クラスが愚かなB::B(int foo) : A(foo) {}
コンストラクターを実装するのを防ぐことです。
私の腸は、ここで何かが怪しいと言っています。いずれかのDerived
クラスがそのコンストラクターでメンバーにアクセスする場合Base
、私は別の場所に行きたいと思いますが、それ以外の場合、アプローチが悪い正当な理由を見つけるのに苦労します.
とにかく、これが許容できるアプローチだと思う場合、参照メンバー (のようなものint& Base::j
) をどのように処理しますか?
注:これは、 C++03 でコンストラクターの継承を偽造するにはどうすればよいですか?へのフォローアップの質問です。.
編集:質問を投稿するときに気が散っていたに違いありません。もちろん、delete b
私が意味するのではなくb->~Base()
。低血糖のせい!
c++ - 動的に作成された配列から POD オブジェクトを構築するときに、placement new を使用することをお勧めしますか?
PODタイプが与えられた場合、次のようなことをすることをお勧めします: