gpt4 book ai didi

c++ - 为父/子关系正确使用 unique_ptr

转载 作者:行者123 更新时间:2023-11-28 07:31:59 25 4
gpt4 key购买 nike

我对 C++ 和智能指针比较陌生,因为我主要使用 C#。我在这里遇到了很多关于正确使用 unique_ptrs 的问题,我想我明白智能指针都是关于所有权的,当指针超出范围时,谁将负责删除指针所持有的内存。

也就是说,下面的例子是否正确? parent 将永远是它的 child 的主人,并管理 child 的一生。但是,如果另一个类需要持有一个 child ,并且永远活得比 child 少,那么该类可以持有一个指向 child 的原始指针吗?

class ChildTypeA;
class ChildTypeB;

class Parent
{
public:
ChildTypeA* createChildA()
{
ChildTypeA *aPtr = new ChildTypeA(/* pass this to constructor */);
typeAChildren.push_back(std::unique_ptr<ChildTypeA>(aPtr));

return aPtr;
}

ChildTypeB* createChildB()
{
ChildTypeB *aPtr = new ChildTypeB(/* pass this to constructor */);
typeBChildren.push_back(std::unique_ptr<ChildTypeB>(aPtr));

return aPtr;
}

void somethingCalledByChildA()
{}

void somethingCalledByChildB()
{}

private:
std::vector<std::unique_ptr<ChildTypeA>> typeAChildren;
std::vector<std::unique_ptr<ChildTypeB>> typeBChildren;
};

class ChildTypeA
{
public:
ChildTypeA() {} // parameterless constructor purely for single file example
ChildTypeA(Parent *parent) : owningParent(parent)
{}

void notifyParentOfSomethingA()
{
owningParent->somethingCalledByChildA();
}

void doSomethingOnThisChild()
{}

private:
Parent *owningParent;

};

class ChildTypeB
{
public:
ChildTypeB() {} // parameterless constructor purely for single file example
ChildTypeB(Parent *parent) : owningParent(parent)
{}

void notifyParentOfSomethingB()
{
owningParent->somethingCalledByChildB();
}

private:
Parent *owningParent;

};

class SomeOtherClassThatWantsAChildAAndWillAlwaysLiveShorterThanChildA
{
public:
SomeOtherClassThatWantsAChildAAndWillAlwaysLiveShorterThanChildA(ChildTypeA *child) : childNotOwnedByMe(child)
{}

void doSomething()
{
childNotOwnedByMe->doSomethingOnThisChild();
}

private:
ChildTypeA * childNotOwnedByMe;
};

那么某处的代码会做类似的事情:

ChildTypeA *a = someInstanceOfParent->createChildA();
auto x = new SomeOtherClassThatWantsAChildAAndWillAlwaysLiveShorterThanChildA(a);

最佳答案

这个例子是正确的,unique_ptr 是关于所有权的,这并不妨碍从其他类引用原始指针,需要记住的事情是:

1) 使用前检查裸指针。

2) 不要在原始指针上调用delete

关于c++ - 为父/子关系正确使用 unique_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17481184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com