[英]Using a shared_ptr with objects
我有一个名为Board
的结构。 在此结构中,我有一个名为parentBoard
的属性,该属性应该指向另一个Board
对象。 我本来打算使用常规指针来执行此操作,但是我在stl中为shared_pointers
找到了一些东西。 如果我这样定义shared_ptr: shared_ptr<Board> pointerToParentBoard;
,如何指出已定义的Board
对象?
我已经尝试过了,希望它就像一个普通的指针:
pointerToNewBoard = &board1;
但是,事实并非如此,我在Google上找不到任何可以帮助的东西。 任何帮助是极大的赞赏!
编辑:在我的项目中,内存泄漏非常昂贵,可能很难跟踪所有分配的内存,这就是为什么我要使用智能指针。
保持父指针原始,但通过智能指针管理子代。
struct Board
{
private:
std::shared_pointer<std::vector<Board>> children;
Board * parent;
public:
Board(Board * ptr=nullptr):children(std::make_shared<std::vector<Board>>())
{
// don't add here, it becomes recursive
parent = ptr;
}
// or add here
Board addNew()
{
children->push_back(Board(this));
return children->back();
}
// or add here
void add(Board * ptr)
{
children->push_back(*ptr);
}
// make parent
// should only use if "this" is a root node
void makeParent(Board * b)
{
b.add(this);
if(nullptr==parent)
parent = b;
else
throw std::runtime_error("This node is not root. Can't change parent.");
}
}
这样,当仅释放父对象时,可以自动将孩子独立地释放,这意味着孩子的范围是其父对象。
同样不要忘记为三/五规则添加构造函数。
避免在c ++中使用原始指针,以避免意外的内存泄漏。 为了避免循环引用,请将std :: weak_ptr用作父成员。
struct Board
{
private:
std::weak_ptr<Board> _parent;
public:
Board(std::shared_ptr<Board> parent = nullptr) {
_parent = parent;
}
std::shared_ptr<Board> getParent() {
std::shared_ptr<Board> strong = std::shared_ptr<Board>(_parent);
return strong ? strong : nullptr;
}
std::shared_ptr<Board> traverseToRoot() {
std::shared_ptr<Board> grand_parent = getParent();
std::shared_ptr<Board> parent = grand_parent;
while (!grand_parent) {
parent = grand_parent;
grand_parent = grand_parent->getParent();
}
return parent;
}
};
int main()
{
std::shared_ptr<Board> greatgrandparent = make_shared <Board>();
std::shared_ptr<Board> grandparent = make_shared <Board>(greatgrandparent);
std::shared_ptr<Board> parent = make_shared <Board>(grandparent);
auto great_great_grand_parent = parent->traverseToRoot();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.