簡體   English   中英

如果你“刪除這個”會發生什么; 在成員 function 中?

[英]what will happen if you do “delete this;” in a member function?

如果成員 function 嘗試delete this; ,比如在下面的class的構造函數中?

class A
{
public:
    A(int);
    ~A();
    int *pi;
}

A::A(int i)
{
    delete this;
    pi = new int(i);
}

A::~A()
{
    delete pi;
}

這個C++ FAQ 條目很好地回答了這個問題,在這里重復:

只要你小心,object delete this .

以下是我對“小心”的定義:

  • 您必須絕對 100% 肯定地確定此 object 是通過 new 分配的(不是通過 new[],也不是通過放置 new,也不是堆棧上的本地 object,也不是全局的,也不是另一個 ZA8CFDE6331BD49EB6666F8911 的成員,而是普通的 C;新的)。
  • 您必須絕對 100% 肯定地確定您的成員 function 將是在此 object 上調用的最后一個成員 function。
  • 您必須絕對 100% 肯定您的會員 function 的 rest(刪除此行之后)不會觸及此 object 的任何部分(包括呼叫任何會員功能)。
  • 您必須絕對 100% 肯定地確定在刪除此行之后甚至沒有人觸摸 this 指針本身。 換句話說,你不能檢查它,將它與另一個指針進行比較,將它與 NULL 進行比較,打印它,投射它,用它做任何事情。

delete this后訪問pi違反了#3

壞事。 你可以delete this; 但這通常是一個非常糟糕的主意,一旦完成,您就無法觸摸任何成員變量或成員函數。

一般來說,從成員 function 內部調用delete this是明確定義的,如果有一點風險的話。

但是從構造函數調用它可能是一個非常糟糕的主意(我不知道它是否定義明確)。 為什么你會想要那樣做?

您可以delete this ,但這假定該實例是使用new創建的,並且您不再訪問該實例的任何成員。

在您的示例中,如果您這樣做,幾乎會發生相同的情況

class A
{
public:
    A(int);
    int *pi;
};

A::A(int i)
{
    pi = new int(i);
}

int main()
{
   A* p = new A(10);
   delete p;
   p->pi = new int; //bad stuff

//or
   A a(20);
   delete &a;  //bad stuff
   a.pi = new int; //more bad stuff
}

更糟糕的事情發生了,因為當你delete this時, pi成員被統一化,導致析構函數試圖刪除一個懸空指針。

使用 delete this 是一種不好的做法,但是,如果使用,則必須考慮以下幾點。

1) delete 運算符僅適用於使用 new 運算符分配的對象。 如果 object 是使用 new 創建的,那么我們可以刪除它,否則行為未定義。

  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();

 return 0;
}

2)一旦刪除完成,刪除后object的任何成員都不應訪問。

 class A {
   int x;
  public:
    A() { x = 0;}
     void fun() {
      delete this;

    /* Invalid: Undefined Behavior */
    cout<<x;
  }
 };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM