比如
templace<typename T>
struct People{
T info;
People* last;
People* next;
People() = default;
~People() default;
};
對于這樣一個結構,在另一個類中用于儲存資料,然后該類有個remove函式移除某個索引的資料
template<typename T>
class PeopleList{
private:
People<T>* allPeople;
//....
public:
void remove(std::size_t index);
};
template<typename T>
void PeopleList<T>::remove(std::size_t index){
People<T>* tmp = allPeople;;
std::size_t currentIndex = 0;
while(currentIndex != (index - 1)){
tmp = tmp->last;
++currentIndex;
}
tmp->T::~T();//??如何呼叫People的解構式
delete tmp;
}
對于由多個People組成的鏈表,我要洗掉其中的某個元素,要做2步
1.呼叫People的解構式,因為People里的info可能跟也申請了記憶體
2.洗掉People所在的記憶體
那如何呼叫People的解構式
uj5u.com熱心網友回復:
C語言已經有malloc與free,C++為啥需要new delete呢?就是因為new 自動呼叫建構式,delete自動呼叫解構式。
delete tmp,自動呼叫~People解構式,不用顯示呼叫
如果使用了place new,需要顯示呼叫建構式與解構式
例如
BYTE* pb = new BYTE[sizeof(std::string)];
((std::string*)pb)->std::basic_string<char, std::char_traits<char>, std::allocator<char>>::basic_string();
((std::string*)pb)->std::basic_string<char, std::char_traits<char>, std::allocator<char>>::~basic_string();
模板真的要呼叫解構式(上面的例子已經給出std::string模板例子)
tmp->People<T>::~People();
uj5u.com熱心網友回復:
直接delete就可以了delete tmp時候會自動呼叫tmp的解構式,而在tmp的解構式中洗掉tmp所包含的記憶體
uj5u.com熱心網友回復:
這有什么難的?PeopleList里洗掉allPeople
tmp->T::~T();//這是錯誤代碼,不需要。delete自動會這樣呼叫
delete tmp;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/195654.html
標籤:C++ 語言
