2016-06-07 97 views
0

我有一個問題。 考慮這個模板類模板類與指針的析構函數

template<class T> 
class nodo{ 
public: 
    T data; 
}; 

讓我們假設,我不是重新定義析構函數。如果我們假設T = int,則標準析構函數將取消分配數據。但是如果T = int *會發生什麼?只是指針將被釋放或對象指向了?理論上只是指針。

如何取消分配指向的對象? 最後,我該如何編寫一個模板類的析構函數,該模板類的模板參數可能是一個指針(以及明確的重新分配)?

+4

簡單修復,使'T'爲'unique_ptr '代替。然後指向的對象會自動銷燬 – vu1p3n0x

+2

這與您完成'class nodo {public:int * data;}'沒有區別。 – GManNickG

+0

@ vu1p3n0x,即使數據不是指針,unique_ptr也可以工作嗎? – CodeBott

回答

2

你最好的選擇是使用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 ThreeThe Rule of Five相關的所有問題。

+0

謝謝,但它工作,即使數據不是一個指針? – CodeBott

+1

@CodeBott,對'int'類型的節點使用'nodo '。當節點意圖保存指針時,使用'nodo >'而不是'node ''。 –

+0

它看起來非常好!我會嘗試,Thx – CodeBott

0

你需要的是指針類型部分專業模板:

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; } 
}; 
+0

它看起來是一個很好的解決方案。我對其他想法很感興趣。謝謝 – CodeBott

+0

當T是一個指針時,至少禁止複製類。否則,如果班級被複制,你將擁有UB。 –