我有一個問題。 考慮這個模板類模板類與指針的析構函數
template<class T>
class nodo{
public:
T data;
};
讓我們假設,我不是重新定義析構函數。如果我們假設T = int,則標準析構函數將取消分配數據。但是如果T = int *會發生什麼?只是指針將被釋放或對象指向了?理論上只是指針。
如何取消分配指向的對象? 最後,我該如何編寫一個模板類的析構函數,該模板類的模板參數可能是一個指針(以及明確的重新分配)?
我有一個問題。 考慮這個模板類模板類與指針的析構函數
template<class T>
class nodo{
public:
T data;
};
讓我們假設,我不是重新定義析構函數。如果我們假設T = int,則標準析構函數將取消分配數據。但是如果T = int *會發生什麼?只是指針將被釋放或對象指向了?理論上只是指針。
如何取消分配指向的對象? 最後,我該如何編寫一個模板類的析構函數,該模板類的模板參數可能是一個指針(以及明確的重新分配)?
你最好的選擇是使用std::unique_ptr<int>
或std::shared_ptr<int>
作爲模板參數,即使用
nodo<std::unique_ptr<int>> n1;
代替
nodo<int*> n1;
你可以嘗試像這樣:
// Noop deleter
template <typename T> struct deleter
{
void operator()(T& ptr) {}
};
// deleter that does something
template <typename T> struct deleter<T*>
{
void operator()(T* ptr) { delete ptr; }
};
template<class T>
class nodo{
public:
using deleter_t = deleter<T>;
T data;
~nodo()
{
deleter_t()(data);
}
};
但是,那麼你必須擔心另一罐蠕蟲。 nodo
是複製構建的還是分配給另一個nodo
對象時會發生什麼?您需要注意使The Rule of Three和The Rule of Five相關的所有問題。
你需要的是指針類型部分專業模板:
template<typename T> class Test {
T val;
public:
Test(T const &v) : val(v) {}
};
// Specialize for pointers
template<typename T> class Test<T*> {
T* val;
public:
Test(T* v) : val(v) {}
~Test() { delete val; }
};
它看起來是一個很好的解決方案。我對其他想法很感興趣。謝謝 – CodeBott
當T是一個指針時,至少禁止複製類。否則,如果班級被複制,你將擁有UB。 –
簡單修復,使'T'爲'unique_ptr'代替。然後指向的對象會自動銷燬 –
vu1p3n0x
這與您完成'class nodo {public:int * data;}'沒有區別。 – GManNickG
@ vu1p3n0x,即使數據不是指針,unique_ptr也可以工作嗎? – CodeBott