2017-10-05 108 views
0

This看起來類似於我所在的位置以及this問題。C++內部類破壞程序資源管理

考慮以下

template<typename T> 
class A 
{ 

private: 

    class B 
    { 

    private: 

     B* link; 

    public: 

     B(); 
     ~B(); 

    }; 

    B* head; 

public: 

    A(); 
    ~A(); 
}; 

上面生成以下假設函數來建立和連結各B被聲明的結構和定義

EI6yn6W

如果我執行的操作,如上所示,然後

B* position = head; 
position = head->link; 
head->link = nullptr; 
delete[] head; 
head = position; 

我明白,調用內部類析構函數將導致外部類析構函數被調用。我是否正確處理了垃圾收集資源x還是我做了一些未定義的內容?

+1

爲什麼你認爲調用內部類的析構函數(你永遠不會在你發佈的示例中做)將導致外部類析構函數被調用?這是另一種方式,不是嗎? – bnaecker

+1

「我做了一件未定義的東西嗎?」是。在非數組類型上調用'delete []'是UB。 – bnaecker

+0

我認爲你是錯誤的「內部」類與「基地」類。如果基類具有虛擬析構函數,則當調用base(「inner」)類析構函數時,將調用派生(「外部」)類的析構函數。而C++中沒有「垃圾收集」。 – VTT

回答

0

在提供的代碼中,內部類不會調用外部類的析構函數,也不應該這樣做,因爲外部類只有一個指向內部類的指針作爲成員。

如果A使用自動存儲持續時間創建(即作爲無新變量的變量),則無需垃圾回收。當它超出範圍時它將被銷燬。經驗法則是每個new應該有一個匹配的delete

爲了說明我已經簡化了代碼,放在節點移除代碼在一個成員函數,並提供其使用的一個簡單的例子:

struct A 
{ 
    struct B 
    { 
     B* link; 
    }; 
    B* head; 
    void delete_head() 
    { 
     B* position = head; 
     position = head->link; 
     //head->link = nullptr; // not needed, it is being deleted anyway 
     delete head; // not delete[]! This isn't an array pointer 
     head = position; 
    } 
}; 

int main() 
{ 
    A a; 
    a.head = new A::B; // create head node 
    a.head->link = new A::B; // create node 
    a.delete_head(); // call A::~B() 
    a.delete_head(); // call A::~B() 
    // no more nodes in a, but A's destructor is not yet called 
} // A::~A() is called here