2012-05-12 16 views
1

我有一個模板類(Node是BST內的一個內部類)。現在是釋放內存的時候了;鑑於關鍵或價值(或兩者)可能是指針,我必須弄清楚如何釋放它們。如何刪除一個指針,如果它是一個模板值?

看到一個例子:

~Node(void) 
{ 
    if (is_pointer<TValue>(Value)) 
    { 
     delete Value; 
     Value = NULL; 
    } 

    if (is_pointer<TComparable>(Key)) 
    { 
     delete Key; 
     Key= NULL; 
    } 
} 

背後的is_pointer<T>功能工作(從here兩者)​​的實施,但是隻要我按刪除任何項或值,我得到如下:

Error 13 error C2440: 'delete' : cannot convert from 'esc::Shader' to 'void *' c:\programming\c++\git\escalator\engine\engine\searchtree.hpp 131 
Error 14 error C2440: 'delete' : cannot convert from 'esc::ShaderComparable' to 'void *' c:\programming\c++\git\escalator\engine\engine\searchtree.hpp 137 
Error 12 error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion) c:\programming\c++\git\escalator\engine\engine\searchtree.hpp 130 

我試過static_cast,dynamic_cast, reinterpret_cast等,但這些都沒有工作。

什麼是一個好的解決方案?

+1

附註:嘗試將null分配給值,然後** **刪除沒有意義。 '刪除值;值= NULL;'看起來會更好。 –

+0

整頓。謝謝;) – zeboidlund

回答

4
I must figure out how to free them if they are. 

不要。真的 - 不要。這就是用戶的問題 - 如果他想要這種行爲,他可以提供一個智能指針。畢竟,如果我想映射非擁有指針呢?或者需要一個定製的刪除器?

此外,您的代碼無法正常工作,因爲您無論如何都會編譯死代碼if分支,因爲您沒有使用專業化。

+0

我不認爲這會起作用。用戶應該能夠從BST中刪除節點。因此,如果它是這樣的:'BST-> eraseNode(specific_key)',那麼如果用戶必須首先「查找」節點,然後知道他/她將要執行的「Value」的數據類型'〜Value'和內存釋放,並且只有在Node之後才能被銷燬。我認爲,標量指針與非標量數據類型以及實現定製刪除器的區別非常簡單,用戶不應該受到這種不便。 –

2

它看起來像你正在存儲類型T的元素的副本,而不是通常做的指針。如果你的聲明是T Value;比你的Node類通常不負責刪除Value對象。

+0

它是什麼刪除它?在這種情況下是否有自動內存管理這樣的事情? – zeboidlund

+0

問題是誰是**負責**的對象。也許你的預期使用模式是你的Node類總是負責對象(不太可能)。嘗試使用自己的班級,看看你的期望是什麼。很有可能你會發現'Node '並不意味着節點需要刪除這個值所指向的任何東西(也就是說,你可能需要一個大的字符串,節點指向隨機的位置)。你可能想明確指定所有權,但是可能你需要Node類中的'T * Value'...... –

0

這真的取決於你在這裏工作的軟件類型。除非它是一些快速測試,並且你不打算重複使用代碼,那麼是的,不要打擾對象或數組的區別指針。但是,如果你正在編寫庫代碼,並且你認爲你的組件會被其他人重用,那麼你應該關心自己的清潔問題。自從時代的黎明以來,STL向量就成功地做到了這一點。最後,我看到他們爲向量的(First,Last)元素調用Destroy函數的代碼,並將值標記作爲第三個參數傳遞給函數。如果元素只是平面標量指針(意思是int *),則不需要調用析構函數。很明顯,真實數據已經由用戶分配,只有數據的地址已經存儲在一個向量中,所以不應該解除分配。但是,如果存儲在向量中的對象(例如用戶定義的類的對象,類A,讓我們說),則需要爲vector〜A()中的每個元素調用析構函數,然後在所有元素之後運行到最後,用於存儲元素的連續內存塊應該通過使用矢量分配器來解除分配。有關更多信息,您可以輕鬆打開矢量實現,它都在頭文件中,查看〜vector()實現並讓它指導您。

相關問題