C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

これをC++で削除しますか?


Deleteは、Variableのストレージスペースの割り当てを解除するために使用される演算子です。

このポインタは、非静的メンバー関数内でのみアクセスできる一種のポインタであり、メンバー関数を呼び出したオブジェクトのアドレスを指します。

このポインタは現在のオブジェクトのアドレスを保持します。簡単に言えば、このポインタはクラスの現在のオブジェクトを指していると言えます

オブジェクトを介してメンバー関数を呼び出すときは常に、コンパイラはそのオブジェクトを呼び出すアドレスを、このポインタとしてメンバー関数の最初のパラメータとして密かに渡します。

通常、このポインタには削除演算子を使用しないでください。使用する場合は、次の点を考慮する必要があるとします。

理想的には、このポインターには削除演算子を使用しないでください。ただし、使用する場合は、次の点を考慮する必要があります。

  • 削除演算子は、演算子newを使用して割り当てられたオブジェクトに対してのみ機能します(この投稿を参照)。オブジェクトがnewを使用して作成されている場合は、これを削除できます。それ以外の場合、動作は未定義です。

filter_none
edit
play_arrow
brightness_4
class A {
   public:
   void fun() {
      delete this;
   }
};
int main() {
   /* Following is Valid */
   A *ptr = new A;
   ptr->fun();
   ptr = NULL; // make ptr NULL to make sure that things are not accessed using ptr.
   /* And following is Invalid: Undefined Behavior */
   A a;
   a.fun();
   getchar();
   return 0;
}
  • 削除が完了すると、削除後に削除されたオブジェクトのメンバーにアクセスできなくなります。

filter_none
edit
play_arrow
brightness_4
#include<iostream>
using namespace std;
class A {
   int x;
   public:
   A() { x = 0;}
   void fun() {
      delete this;
      /* Invalid: Undefined Behavior */
      cout<<x;
   }
};

最善の方法は、これをまったく削除しないことです。

メンバー関数内でこのポインターを削除するのは間違っています。絶対に削除しないでください。しかし、これらを行うと、次のことが起こる可能性があります。

  • このメンバー関数が呼び出されるオブジェクトがスタック上に作成されている場合、このポインターを削除すると、アプリケーションがクラッシュするか、未定義の動作が発生します。

  • このメンバー関数が呼び出されるオブジェクトがnew演算子を使用してヒープ上に作成された場合、このポインターを削除するとオブジェクトが破棄されます。その特定の時間にアプリケーションをクラッシュさせることはありませんが、その後、一部のメンバー関数がこのオブジェクトを介してメンバー変数にアクセスしようとすると、アプリケーションがクラッシュします。

#include <iostream>
class Dummy {
   int m_value;
   public:
   Dummy(int val) :
   m_value(val)
   {}
   void destroy();
   void displayValue();
   void displayText();
};
void Dummy::destroy() {
   delete this;
}
void Dummy::displayValue() {
   std::cout << this->m_value << std::endl;
}
void Dummy::displayText() {
   std::cout << "Not accessing any member function" << std::endl;
}
int main() {
   Dummy * dummyPtr = new Dummy(5);
   dummyPtr->destroy();
   dummyPtr->displayText();
   return 0;
}

destroy()メンバー関数でこのポインターを削除した後は、displayText()を呼び出しても、メンバー関数にアクセスしていないため安全です。ただし、displayValue()を呼び出すと、ダングリングポインターを介してメンバー変数にアクセスしているため、つまりこのポインターが削除されているため、アプリケーションがクラッシュします。


  1. C++でツリーノードを削除する

    ツリーがあり、このツリーはノード0をルートとしていると仮定します。これは、次のように与えられます- ノードの数はノードです i番目のノードの値はvalue[i] i番目のノードの親はparent[i] ノードの値の合計が0であるすべてのサブツリーを削除する必要があります。削除すると、ツリーに残っているノードの数が返されます。したがって、ツリーが次のような場合- 7つのノードがあり、出力は2になります これを解決するには、次の手順に従います- 子供と呼ばれる地図を作成する dfs()というメソッドを定義します。これにより、ノード、配列値、グラフが取得されます temp:=ペ

  2. C++でBSTのノードを削除する

    二分探索木があるとします。 1つのキーkを取得し、指定されたキーkをBSTから削除して、更新されたBSTを返す必要があります。したがって、ツリーが次のような場合- そして、キーk =3の場合、出力ツリーは-になります。 これを解決するには、次の手順に従います- ルートノードを削除するためにdeleteRoot()というメソッドを定義します。これは次のように機能します ルートがnullの場合、nullを返します ルートに右のサブツリーがない場合は、ルートの左に戻ります x:=ルートの後継者 xの左側を左に設定:=ルートの左側 ルート