我在刷新了C++知識後,多年沒有使用它。在編寫一些代碼來實現一些實踐數據結構時,我想確保我的代碼是異常安全的。所以我試圖用我認爲合適的方式使用std::auto_ptr
。有些簡化,這是我有:auto_ptr將所有權轉移到容器的習慣性使用
class Tree
{
public:
~Tree() { /* delete all Node*s in the tree */ }
void insert(const string& to_insert);
...
private:
struct Node {
...
vector<Node*> m_children;
};
Node* m_root;
};
template<T>
void push_back(vector<T*>& v, auto_ptr<T> x)
{
v.push_back(x.get());
x.release();
}
void Tree::insert(const string& to_insert)
{
Node* n = ...; // find where to insert the new node
...
push_back(n->m_children, auto_ptr<Node>(new Node(to_insert));
...
}
所以我包裹,將放指針放入容器內,vector::push_back
功能,並依託由價值auto_ptr
參數 確保Node*
是如果vector
調整大小失敗,則將其刪除。
這是一種慣用的使用auto_ptr
在我的 Tree::insert
保存一些樣板?你可以提出任何改進建議?否則,我得有 類似:雜波的
Node* n = ...; // find where to insert the new node
auto_ptr<Node> new_node(new Node(to_insert));
n->m_children.push_back(new_node.get());
new_node.release();
哪種了什麼將是一個單一的代碼行,如果我不 擔心異常安全和內存泄漏。 (其實我想知道是否可以發佈我的整個代碼示例(約300行),並要求人們批評它的習慣C++用法,但我不確定這種問題是否適合在計算器上。)
重新編寫自己的容器,當然,我通常會尋找現有的實現。 (在這種情況下,我寫的真正的數據結構就是一個帕特里夏。)但是如前所述,寫這本書比實踐更適合實踐。我知道在STL容器中使用auto_ptrs是不可能的。 有關論證評價順序的觀點很好!在我的情況下,我應該沒問題,因爲另一個參數只是一個成員查找,但我想這是一致的,總是命名我的auto_ptrs以避免這個潛在的問題。 – heycam 2010-05-19 01:43:12