問題タブ [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++ - 演算子のオーバーロード(特に「新しい」)アリティはどのように機能しますか?
演算子のオーバーロードの引数リストが体系的な方法でどのように決定されるかを完全に理解したことはありません。特に、現在の問題に混乱しています。
単項演算子をオーバーロードすると、引数が1つ、またはクラスメンバーの場合はゼロになります。二項演算子をオーバーロードすると、2つの引数があり、クラスメンバーの場合は1つの引数があります。少なくとも、それが機能しているように見える方法です。operator new
ただし、(クラスメンバーではなく)問題が発生しています。
私が作業しているコードベースには、過去に見た他の場所(たとえばここなど)と同様に、メモリデバッグ用#define new new(__FILE__, __LINE__)
の署名などを使用したdefinelikeおよび対応する関数があります。void *new(size_t size, const char *file, unsigned line)
私のプロジェクトのものは、実際には以前にリンクされたものとは異なることに注意してください。何らかの理由で新しい配置を台無しにしているので、これは私にとって問題を提示します。私はC++プログラミング言語を調べましたが、それがこれを説明しているのなら、私はそれを見逃しています。
new
この点で特別ですか?つまり、特定の言語で定義された追加のデバッグ署名がありますか?上で述べたように、場所によってわずかに異なる署名が表示されているため、そのようには見えません。もしそうなら、他のどの演算子が非自明な署名を持っていますか、そしてそれらは何ですか?これらのさまざまな署名は、代わりにいくつかの実装固有の追加機能ですか?もしそうなら、ほとんどの実装が何をするかについての一般的なルールはありますか?あるいは、それは私が私のタイトルで暗示したようなアリティの問題ですか?署名で必要な数の追加の引数を追加するnew
ことができますか?キーワード自体と必要な新しい型の間の引数を使用してnewを呼び出す場合は、何でもできますか?それとも私はさらに混乱していて、他に何か足りないものがありますか?
最も重要なのは、短期的には(私はこれを本当に理解したいのですが)、何が私の配置を台無しにしているのnew
でしょうか?マクロがのような展開を引き起こしていnew ("file.cpp", 100) (class_pointer) class_t
ます。括弧内の2つのグループの問題は多分、それとも何か他のものですか?
c++ - C ++、新しいものなしでコンストラクターを直接呼び出すことは可能ですか?
new
オブジェクトのメモリがすでにある場合、を使用せずにコンストラクタを明示的に呼び出すことはできますか?
c++ - new(this)を使用してコンストラクターを再利用する
これは最近、私がティーチングアシスタントをしているクラスで出てきました。私たちは、c ++でコピーコンストラクターを実行する方法を学生に教えていました。最初にJavaを教えられた学生は、あるコンストラクターを別のコンストラクターから呼び出すことができるかどうか尋ねました。彼らはクラスのコードにペダンティックフラグを使用しており、古い標準ではこれをサポートしていないため、これに対する答えはノーです。Stackoverflowや他のサイトで、new (this)
次のようなものを使用してこれを偽造する提案を見つけました
これは本当に単純なコードであり、コンストラクターを再利用してもコードを保存しないことは明らかですが、これは単なる例です。
私の質問は、これが標準に準拠しているのかどうか、そしてこれが健全なコードになるのを妨げると考えるべきエッジケースがあるかどうかです。
編集:これは私にとって非常に危険であるように思われることに注意する必要がありますが、それは私がそれがどのように悪化する可能性があるかを知ること以上にそれを本当に理解していないという観点からです。生徒から質問があった場合に、なぜそれができるのか、すべきでないのかを生徒に指示できるようにしたかっただけです。私はすでに、すべての実用的な目的で、共有初期化メソッドを使用することを提案しました。これは、実際のプロジェクトよりも教育的な質問です。
c++ - デフォルトのコンストラクターを持たないクラスの配列の new 演算子
デフォルト コンストラクターのないクラスの場合、演算子 new と配置 new を使用して、そのようなクラスの配列を宣言できます。
More Effects C++ でコードを読んでみると、以下のようなコードを見つけました(一部改変しています).....
私の質問は、なぜ演算子 new の後に [] が必要なのですか?
私はそれなしでテストしましたが、それでも動作します。誰かがそれを説明できますか?
c++ - 別のコンストラクターに従うための新しい配置
これは安全ですか?実際の実装では仮想関数を使用していませんが、使用したとしても安全であると信じたくなりました。
c++ - 安全な配置の新しい明示的なデストラクタ呼び出し
これは私のコードの例です:
私の質問は、これは安全な方法ですか?ある条件で隠れた間違いをしますか?すべてのタイプのオブジェクト(PODおよび非POD)で機能しますか?
c++ - 事前に割り当てられたバッファーに作成されたオブジェクトで仮想メソッドを呼び出す C++ のセグメンテーション違反
うーん... タイトルはちょっと言い過ぎですが、これのどの部分が問題を引き起こしているのか本当にわかりません。何度も試してみましたが、その理由を特定することはできません...
アイデアは、単一の Choice インスタンスが、そのテンプレートリストに渡された任意の型の任意の 1 つの値を格納できるようにすることです...格納されている型を追跡し、値を考慮することを除いて、ユニオンのようなものです。これにより、共用体メンバーのコンストラクターに対する C++ の制約を回避できます。
場合によっては機能しますが、クリーンアップ コードに問題があるようです。std::basic_string または引数リストに渡された同様のタイプでこの構造を使用し始めた2番目にセグメンテーション違反が発生し始めましたが、それが問題を引き起こす理由がわかりません。
これは一種の私自身の実験ですが、動作しない理由がわかりません (g++ の C++0x モードでコンパイル):
誰かが私が間違っていることを見つけることができれば、どうもありがとう:)
c++ - 新しいコンストラクターとデフォルト以外のコンストラクターの配置
パラメーターを使用してコンストラクターで C++ プレースメント new を呼び出すことはできますか? カスタム アロケーターを実装しており、機能をデフォルト以外のコンストラクターから init 関数に移動する必要がないようにしたいと考えています。
タイプ CFoo のオブジェクトが、2 番目のコンストラクターを使用して pChunkOfMemory に構築されることを期待します。operator new を使用する場合、デフォルトのコンストラクターのみに固執していますか?
解決しました!私はしませんでし#include <new>
た。この後、placement ::new の呼び出しは、デフォルト以外のコンストラクターで正常に機能しました。
c++ - この2番目の新しいものは何ですか?
2行目は何ですか?(別の質問に答えているときに表示されます。)
2行目以降、xとyは同じ値になります(同じ場所を指します)。y = xと2行目の違いは何ですか?コンストラクターか何かのようなものですか?