我有我的節點定義有點像雙鏈表節點的深層副本:創建
class LLNode
{
public:
std::shared_ptr<LLNode> prev;
std::shared_ptr<LLNode> next;
std::shared_ptr<int> data;
LLNode(void)
: prev(std::shared_ptr<LLNode>(nullptr)),
next(std::shared_ptr<LLNode>(nullptr)),
data(std::shared_ptr<int>(nullptr))
{
}
LLNode(const LLNode &node)
: prev(std::shared_ptr<LLNode>(node.prev == nullptr?nullptr:new LLNode(node.prev))),
next(std::shared_ptr<LLNode>(node.next == nullptr?nullptr:new LLNode(node.next))),
data(std::shared_ptr<int>(new int(node.data)))
{
}
};
但是,如果我有一個鏈接到另一個節點(這顯然將通常的情況節點),複製節點A將實例化下一個節點B的副本,該節點又將嘗試實例化節點A的副本,該副本將嘗試複製節點B等等,直到出現棧溢出或內存錯誤。這可以通過僅實例化下一個(或前一個)的新副本來解決,但是之前(或下一個)鏈接到該節點的任何內容都不會被複制。
有複製雙向鏈表節點的好方法嗎?
我很困惑,爲什麼你使用'shared_ptr',如果你要徹底顛覆它的整個目的。 – GManNickG 2011-02-24 20:31:26
你的問題源於不加區別地使用shared_ptr,否則就會使用指針。僅當您希望指針的多個實例共享引用對象的所有權時才使用shared_ptr。 – 2011-02-24 20:35:37
我希望能夠使用shared_ptr當只想引用下一個/ prev節點,但是當需要節點的深層副本時,它需要創建一個shared_ptr到一個新複製的對象,否則我會只有一個淺拷貝。答案在下面提供,雖然(使用外部複製方法) – helloworld922 2011-02-24 20:48:31