問題タブ [explicit-destructor-call]

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.

0 投票する
4 に答える
2075 参照

c++ - 「placement new」で割り当てられた「単純な POD クラス」のデストラクタを明示的に呼び出す必要がありますか?

ここで「単純」とは、非仮想の空のデストラクタまたは POD 型を持つクラスを意味します。

典型的な例:

で明示的なデストラクタを呼び出さないとどうなりpますか? 未定義の動作やメモリリークではないと思います。
再利用しても問題ありませbufferんか?

0 投票する
2 に答える
725 参照

c++ - オブジェクトとして使用されるカプセル化された char 配列は厳密なエイリアシング ルールに違反しますか

次のクラスは厳密なエイリアシング ルールを破ります。

私の標準の読みは、それが正しくないということですが、よくわかりません (私の使用法は、オブジェクトの配列T+ それらのオブジェクトのいくつかのメタデータを持ちますが、メモリを手動で割り当てずにオブジェクトの構築/分解を制御することです)。標準での配置の例として使用されnewます。

0 投票する
2 に答える
447 参照

c++ - オブジェクトが破棄された後、スカラー型のサブオブジェクトはどうなりますか?

次のコードを検討してください ( と の値が異なる場合renew) cleanse:

assert合格は保証されていますか?

このスタイルが推奨されないことは理解しています。「これは健全な慣行ではない」などの意見は、ここでは重要ではありません

標準的な引用符からの完全な論理的証明を示す回答が必要です。コンパイラの作者の意見も興味深いかもしれません。

編集: 2 つの質問を 1 つにまとめました。renewパラメータを参照してください(renew == 0これは元の質問です)。

EDIT 2:私の質問は本当に次のとおりだと思います:メンバーオブジェクトとは何ですか?

編集 3: 別のcleanseパラメーターを使用するようになりました!

0 投票する
1 に答える
386 参照

c++ - C++、クラスの空のデストラクタ

私はあなたの答えの1つを読みました( 「空の」コンストラクターまたはデストラクタは、生成されたものと同じことをしますか?)。あなたは次のように書いています。コンパイラは、上記の場合と同様に、デストラクタの暗黙的な定義を提供します. そのデストラクタは、 auto_ptr オブジェクトのデストラクタも暗黙的に呼び出します. そして、それが保持している C オブジェクトを指すポインタを削除します - C の定義! これは、構造体 A のコンストラクターが定義されている .cpp ファイルに表示されます。2 つのことを説明してください。1. A のデストラクタが C の定義を知っている必要があるのはなぜですか? 2. A の空のデストラクタを追加すると、どのように状況が改善されますか? ありがとうございました

0 投票する
1 に答える
226 参照

c++ - いつ暗黙の破棄を防ぐ必要がありますか? それはどのように機能しますか?

=deleteデストラクタを宣言できること、またはprivateプログラムがスコープの最後でオブジェクトを暗黙的に削除するのを防ぐことができることを知っています。また、プライベートの場合、呼び出すたびにデストラクタを明示的に呼び出すことができるメンバー関数を使用できることも知っています。void kill() { this–>~A(); }

私の質問は次のとおりです。

  • 暗黙の破壊を防ぎたいと思うのはなぜですか? 例を挙げてください

  • どうする=delete?デストラクタが実行されないようにしますか? では、オブジェクトはそのスコープ外に永遠に存在するのでしょうか?

0 投票する
3 に答える
131 参照

c++ - 配置新規および明示的なデストラクタ呼び出しの正しい使用法

最近のインタビューで、このコードが安全かどうか、また安全である場合、次のようなものをいつ使用するかを尋ねられました。

私の答えは次のとおりです。このコードは安全であり、デストラクタを呼び出して「オブジェクト」で使用されているリソースを解放する必要がある場合は、この手法を使用しますが、同時に「オブジェクト」の割り当てを解除したくありませんでした。メモリ内の場所を保持します(ここで新しい配置によって達成されます)。

正直なところ、面接でこの質問に正しく答える助けを求めているわけではありません。新規および明示的なデストラクタ呼び出しの配置に関する私の理解が正しいかどうかを知りたいだけです。

0 投票する
2 に答える
98 参照

static-constructor - c#で静的クラスのデストラクタを呼び出す方法は?

こんにちは、私はOOPSの初心者です。これを理解するのを手伝ってください

静的クラスの批判者を呼び出す方法は? または、静的クラス、メソッド、およびオブジェクトにメモリを割り当てる方法は?

0 投票する
1 に答える
767 参照

c++ - 「this」ポインターで新しい配置を使用しても安全ですか

現在の実装

unique_ptr互いに依存するフィールドを含むクラスがあります。

使用事例

ResourceManagerここでの使用例は、スタック割り当て変数または非ポインター クラス メンバーとして保持しながら、新しい値をポインターに再割り当てしたい場合です。

私の現在のセットアップでは、次のように使用することを想像しています。

これが問題でさえある理由は、B と C が代入できないという事実によるものです (たとえば、ファイル ストリームの場合)。

醜いオルタナティブ

別の醜い(そして危険な)方法はresetunique_ptrフィールドを明示的に逆の順序にすることです(CはBに依存しているため、最初に破棄する必要があることに注意してください)。デフォルトの破棄動作を効果的に模倣します。

間違った実装は、単にデフォルトの代入演算子を に使用することになることに注意してくださいResourceManagerこれにより、フィールドが順番に割り当てられます。これは、s の順番どおりの破棄を意味しunique_ptrますが、逆順の破棄が必要です。

質問

このthisポインタの配置newと明示的なデストラクタの呼び出しは安全ですか?

元のポインターではなく、返されたポインターを使用する必要がnew_thisありthisますか (たとえば、thisデストラクタを呼び出した後にポインターが技術的に無効になった場合)。

これを達成するためのより良い提案された方法はありますか? そのようなフィールドをクラスにさらに追加する場合unique_ptrは、代入演算子にコピーを追加する必要があります。たとえば、次のように移動コンストラクタを代わりに呼び出すことは可能ですか?