下面是我得到了什麼:無法刪除我的自定義類(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
的實例,該實例應刪除First
和deques
的所有實例。然而,我發現了以下錯誤:
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
命令引發錯誤。我在這裏錯過了什麼?我需要手動實現析構函數,因爲我在堆上創建了一堆東西 - 對嗎?
爲什麼不使用智能指針? – Marcin
在第一堂課,你不需要任何新的或刪除。 'items.push_back(T());'足以將新的T添加到向量中。矢量自動刪除它包含的元素。 –
@Marcin這不是一個好的建議,因爲應該沒有指針。 –