簡體   English   中英

為什么我們需要刪除復制賦值運算符中的指針

[英]Why do we need to delete pointers inside copy assignment operator

我已經看到了幾個復制賦值運算符的示例,並且無法理解為什么我們需要刪除復制賦值運算符中的指針。 例如,如果我有以下課程

 class MyClass
 {
  public:
    MyClass(int a)
    {
      x = new int(a);
    }
    MyClass& operator=(const MyClass& pMyClass)
    {
       *x = *(pMyClass.x);

       // ?????????
       // delete x;
       // x = new int(*(pMyClass.x));
    }
    ~MyClass()
    {
       delete x;
    }
  private:
    int* x;
 }

* x = *(pMyClass.x)行有什么問題? 我只是復制pMyClass.x指向的對象,為什么我需要刪除並重新創建它? 誰能舉例說明此代碼何時會導致內存泄漏?

這是有效的代碼。 但是,如果不是指向單個對象的指針,而是指向數組的第一個元素的指針,並且數組的大小可能不同,那么您需要刪除該數組,以新的大小重新分配它。

將值從一個類實例復制到另一個類實例時, *x = *(pMyClass.x) 我認為,通常,如果在將存儲在x operator=執行地址發送到程序的其他部分之前,刪除一個對象(如果不僅僅是int )可以防止將新對象與新數據一起使用。

因此,這是一個示例(從Bjarne Stroustrup的“ A C ++之旅(第二版)中摘錄)”中的一個用戶定義的矢量類的副本分配:

Vector& Vector::operator=(const Vector& a) // copy assignment
{
double∗ p = new double[a.sz];
for (int i=0; i!=a.sz; ++i)
p[i] = a.elem[i];
delete[] elem; // delete old elements
elem = p; // here elem is the vector's data holding member array
sz = a.sz;
return ∗this;
}

要了解為什么在第6行中執行刪除操作:

delete[] elem; // delete old elements

我們首先需要首先了解復制構造函數和復制分配之間的區別。 在第一種情況(副本構造函數)中,我們創建了一個全新的對象,而在第二種情況(副本分配,我們真正感興趣的對象)中,我們已經有一個現有對象,我們只想將另一個對象的內容復制到其中給定相同類型的對象。

考慮到我們已經有一個現有的對象,我們首先需要清除它的內容,以便我們能夠從打算復制的對象中復制所需的內容。

我希望能回答您的問題。

暫無
暫無

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

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