2014-11-17 51 views
0

下面是我得到了什麼:無法刪除我的自定義類(C++)的堆實例

class MyClass { 
    int holder; 
public: 
    MyClass() { 
     holder = 5; 
    } 
}; 

template<class T> 
class First { 
    std::vector<T> items; 
public: 
    First() { 
     T* tmp; 
     for (int i = 0; i < 20; i++) { 
      tmp = new T(); 
      items.push_back(*tmp); 
     } 
    }; 
    ~First() { 
     for (int i = 0; i < 20; i++) { 
      delete items.at(i); 
     } 
    }; 
}; 

class Second { 
    std::vector<std::deque<First<MyClass>>> items; 
public: 
    Second() { 
     std::deque<First<MyClass>>* tmp; 
     for (int i = 0; i < 10; i++) { 
      tmp = new std::deque<First<MyClass>>; 
      items.push_back(*tmp); 
     } 
    }; 
    ~Second() { 
     for (int i = 0; i < 10; i++) { 
      for (int j = 0; j < items.at(i).size(); j++) { 
       delete items.at(i).at(j); // this deletes the "First" instances 
      } 
      delete items.at(i); // this deletes the deque 
     } 
    }; 
}; 

在我main,我創建了一個Second的實例並將First實例添加到它(thro呃方法不包括在內)。在main的末尾,我刪除了Second的實例,該實例應刪除Firstdeques的所有實例。然而,我發現了以下錯誤:

error: cannot delete expression of type 'value_type' (aka 'MyClass') 
error: cannot delete expression of type 'value_type' (aka 'First<MyClass>') 
error: cannot delete expression of type 'value_type' (aka 'std::deque<First<MyClass>>') 

從本質上講,我所有的delete命令引發錯誤。我在這裏錯過了什麼?我需要手動實現析構函數,因爲我在堆上創建了一堆東西 - 對嗎?

+0

爲什麼不使用智能指針? – Marcin

+0

在第一堂課,你不需要任何新的或刪除。 'items.push_back(T());'足以將新的T添加到向量中。矢量自動刪除它包含的元素。 –

+1

@Marcin這不是一個好的建議,因爲應該沒有指針。 –

回答

5

你永遠不會存儲new表達式的結果。您的代碼也許應該是這樣的:

First() { 
    T* tmp; 
    for (int i = 0; i < 20; i++) { 
     tmp = new T(); 
     items.push_back(*tmp); 
     delete tmp;    // result of "new" is still accessible here 
    } 
} 

~First() { } 

或者這樣:

First() { 
    for (int i = 0; i < 20; i++) { 
     items.push_back(T()); 
    } 
} 

或者只是這樣的:

First() : items(20) {} 
+0

好吧我想我現在明白了。顯然你的方式更好(不需要堆)。然而,在我將拷貝推入vector之前,對嗎?堆中的對象甚至有可能成爲「不在堆中」的結構的「一部分」(我希望我能清楚地問這個問題)。 – n0pe

+1

@ maxmackie:不。對象由連續的內存塊組成,並且具有固定的大小。你當然可以將指向內存其他部分的指針指向對象,但是隻有指針纔是對象的一部分,而不是指針。 –

+0

明白了,謝謝。寫這篇文章的時候我絕對沒有想到:) – n0pe