タグ付けされた質問 「delete-operator」

C ++プログラミング言語では、delete演算子は指定された引数のデストラクタを呼び出し、newによって割り当てられたメモリをヒープに戻します。




10
これは削除できますか?
delete this;delete-statementがクラスのそのインスタンスで実行される最後のステートメントである場合、許可されますか?もちろん、this-pointerで表されるオブジェクトは、newly-created だと確信しています。 私はこのようなことを考えています: void SomeModule::doStuff() { // in the controller, "this" object of SomeModule is the "current module" // now, if I want to switch over to a new Module, eg: controller->setWorkingModule(new OtherModule()); // since the new "OtherModule" object will take the lead, // I want to get rid …

11
サブクラスへのポインターでの削除は、基本クラスのデストラクターを呼び出しますか?
私は、class Aそのフィールドの1つにヒープメモリ割り当てを使用しています。クラスAはインスタンス化され、別のクラス(class B。 クラスBのオブジェクトが完了したら、を呼び出しますdelete。これは、デストラクターを呼び出すと想定しています...しかし、これはクラスAのデストラクターも呼び出しますか? 編集: 答えから、私はそれを採用します(間違っている場合は編集してください): delete BのインスタンスがB ::〜B();を呼び出す 呼び出す A::~A(); A::~A deleteAオブジェクトのヒープに割り当てられたすべてのメンバー変数を明示的に指定する必要があります。 場合-最後のメモリブロックの記憶は、クラスBのインスタンスがヒープに返される前記新しいは、それが最初にすべてのデストラクタがオブジェクトを完成させるために呼び出された今後、それを初期化するコンストラクタを呼び出し、次に、ヒープ上のメモリのブロックを割り当てられ、使用されましたオブジェクトが常駐していたブロックがヒープに返されます。

16
delete []はどのようにしてそれが配列であることを認識しますか?
了解しました。渡された内容によっては、次のコードで何が起こるかは未定義であることに私たちは皆同意していると思います。 void deleteForMe(int* pointer) { delete[] pointer; } ポインタはあらゆる種類のものである可能性があるため、無条件delete[]で実行することは未定義です。ただし、実際に配列ポインターを渡しているとしましょう。 int main() { int* arr = new int[5]; deleteForMe(arr); return 0; } 私の質問は、ポインターが配列であるこの場合、これを知っているのは誰ですか?つまり、言語/コンパイラの観点からarrは、配列ポインターか単一のintへのポインターかはわかりません。一体、arr動的に作成されたかどうかさえわかりません。しかし、代わりに次のようにすると、 int main() { int* num = new int(1); deleteForMe(num); return 0; } OSは、intを1つだけ削除し、そのポイントを超えて残りのメモリを削除することで、ある種の「強制終了」を行わないほどスマートです(それとstrlen、\0終端されていない文字列とは対照的です-それまでは続きます)ヒット0)。 では、これらのことを覚えておくことは誰の仕事なのでしょうか。OSは何らかのタイプの記録をバックグラウンドで保持しますか?(つまり、何が起きるかは未定義であると言ってこの投稿を始めたことを私は理解していますが、実際、「殺害酒宴」シナリオは発生しないため、実際の世界では誰かが覚えています。)


6
Visual Studioは削除されたポインターをどのように処理しますか、そしてその理由は何ですか?
私が読んでいるC ++の本では、delete演算子を使用してポインターが削除されると、ポインターが指している場所のメモリーが「解放」され、上書きされる可能性があると述べています。また、ポインターが再割り当てされるか、またはに設定されるまで、ポインターは同じ場所を指し続けると述べていますNULL。 ただし、Visual Studio 2012では。これはそうではないようです! 例: #include <iostream> using namespace std; int main() { int* ptr = new int; cout << "ptr = " << ptr << endl; delete ptr; cout << "ptr = " << ptr << endl; system("pause"); return 0; } このプログラムをコンパイルして実行すると、次の出力が得られます。 ptr = 0050BC10 ptr = 00008123 …

12
削除してもポインタがNULLに設定されないのはなぜですか?
削除後のポインタのNULLへの自動設定が標準の一部ではないのはなぜかといつも疑問に思いました。これが処理されれば、無効なポインタによるクラッシュの多くは発生しません。しかし、標準がこれを制限していたいくつかの理由を考えることができると言いましたが: パフォーマンス: 追加の命令により、deleteパフォーマンスが低下する可能性があります。 constポインタのせいかもしれません。 そして、スタンダードはこの特別なケースのために何かをしたかもしれません。 これを許可しない正確な理由を誰かが知っていますか?

6
C ++でのポインターの削除
コンテキスト:私はポインターを頭にかぶろうとしています。数週間前に学校でそれらを見ただけで、今日練習しているときに、ばかげたことに遭遇しましたか?問題、それはあなたにとって非常に簡単ですが、プログラミングの経験はほとんどありません。 私はSOの中でポインタの削除についてかなり多くの質問を見てきましたが、それらはすべて「単純な」ポインタ(または適切な用語が何であれ)ではなくクラスの削除に関連しているようです、これが私がしようとしているコードです実行: #include <iostream>; using namespace std; int main() { int myVar, *myPointer; myVar = 8; myPointer = &myVar; cout << "delete-ing pointers " << endl; cout << "Memory address: " << myPointer << endl; // Seems I can't *just* delete it, as it triggers an error delete myPointer; cout …

5
constへのポインターの削除(T const *)
constポインタに関する基本的な質問があります。constポインターを使用して非constメンバー関数を呼び出すことは許可されていません。ただし、constポインターでこれを行うことは許可されています。 delete p; これは、本質的に非const 'メソッド'であるクラスのデストラクタを呼び出します。なぜこれが許可されるのですか?これをサポートするだけですか? delete this; それとも他の理由がありますか?

5
C ++でどのように「再割り当て」しますか?
reallocC ++でどのようにできますか?それは言語から欠落しているようです-ありますがnewありdeleteませんresize! プログラムがより多くのデータを読み取るにつれて、それを保持するためにバッファーを再割り当てする必要があるため、これが必要です。delete古いポインタを使用してnew、新しい、より大きなポインタを使用することは正しい選択肢ではないと思います。

2
c ++ 0xでnullptrを削除しても安全ですか?
でc++03、nullポインタを削除しても効果がないことは明らかです。確かに、それはその中で明確に述べられ§5.3.5/2ています: どちらの方法でも、deleteのオペランドの値がnullポインターの場合、操作は効果がありません。 ただし、この文の現在のドラフトではc++0x欠落しているようです。ドラフトの残りの部分では、delete-expressionのオペランドがnullポインター定数でない場合に何が起こるかを示す文しか見つかりませんでした。ヌルポインタの削除はまだで定義されてc++0xいますか?もしそうなら、どこで? ノート: それがまだ十分に定義されていることを示唆する重要な状況証拠があります。 まず、次のように§5.3.5/2述べている2つの文があります 最初の選択肢(オブジェクトの削除)では、deleteのオペランドの値はnullポインター値である可能性があります... そして 2番目の選択肢(配列の削除)では、deleteのオペランドの値はnullポインター値または... これらは、オペランドがnullであることが許可されていることを示していますが、それ自体では、nullの場合に何が起こるかを実際には定義していません。 第二に、の意味を変更することdelete 0は大きな重大な変更であり、標準化委員会がこの特定の変更を行う可能性はほとんどありません。さらに、これがc++0xドラフトの互換性アネックス(アネックスC)の重大な変更であるという言及はありません。ただし、附属書Cは有益なセクションであるため、これには規格の解釈は含まれていません。 一方、nullポインタを削除しても効果がないという事実は、追加の実行時チェックを意味します。多くのコードでは、オペランドがnullになることはないため、このランタイムチェックはオーバーヘッドゼロの原則と矛盾します。たぶん、委員会は、標準のc ++を言語の指定された設計目標にさらに一致させるために、動作を変更することを決定しました。

1
operator new()は、デフォルトのコンストラクターの存在に応じて、delete()が削除された場合の動作が異なります。
演算子new()を使用してクラスCの新しいオブジェクトを作成すると、ここでエラーが発生します。 class C { public: C() {} virtual ~C() {} void operator delete(void*) = delete; }; int main() { C* c = new C; } と C2280: 'void C::operator delete(void *)': function was explicitly deleted 私は交換するときでもC() {} とC() = default; か、そのコンパイラが(私はと同じ効果を持つと信じデフォルトコンストラクタを挿入するように、行を削除= default)、コードはコンパイルして実行します。 コンパイラが生成したデフォルトのコンストラクタとユーザー定義のデフォルトのコンストラクタの違いは何ですか? 私はこの投稿でいくつかのヒントを得ましたが、デストラクタが仮想なので、ここのクラスC(ユーザー提供のコンストラクタなし)は簡単ではありませんよね? 最新のVisual Studio、c ++ 17でコンパイルされています。

3
演算子の削除でデストラクタが呼び出されないのはなぜですか?
私はそれに::deleteクラスを呼び込もうとしましたoperator delete。しかし、デストラクタは呼び出されません。 私は、クラス定義されMyClass、そのoperator deleteオーバーロードされているが。グローバルoperator deleteもオーバーロードされています。のオーバーロードoperator deleteはMyClass、オーバーロードされたグローバルを呼び出しますoperator delete。 class MyClass { public: MyClass() { printf("Constructing MyClass...\n"); } virtual ~MyClass() { printf("Destroying MyClass...\n"); } void* operator new(size_t size) { printf("Newing MyClass...\n"); void* p = ::new MyClass(); printf("End of newing MyClass...\n"); return p; } void operator delete(void* p) { printf("Deleting MyClass...\n"); ::delete p; …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.