这是我正在做的事情的工作版本。
#include <memory>
using namespace std;
struct thing {
int blah;
};
struct parentObj {
parentObj(thing & incomingThing) : isThisOK(incomingThing) {};
thing & isThisOK;
};
int main()
{
shared_ptr<thing> thingInstance = make_shared<thing>();
shared_ptr<parentObj> theObj = make_shared<parentObj>(*thingInstance);
}
我喜欢将共享指针分配给其类型的引用。 (ctrl+f 这样就OK了)
这里会产生意想不到的后果吗?我应该使用弱指针吗?
最佳答案
就像这样:
#include <memory>
using namespace std;
struct thing {
int blah;
};
struct parentObj {
parentObj(thing& incomingThing) : isThisOK(incomingThing) {};
thing& isThisOK;
};
int main()
{
thing thingInstance;
shared_ptr<parentObj> theObj = make_shared<parentObj>(thingInstance);
}
就像函数参数默认情况下应该与所有权策略无关(除非需要)一样,我想说你正在做的事情是正确的,甚至在特定情况下推荐它。如果您的对象不知道所有权策略(除非需要),那么这通常是可行的方法。
请注意两件事:
- 您必须谨慎对待自己的一生,并在出现
parentObj
时设定界限。应视为无效。 - 请注意,当您使用
std::unique_ptr
时,执行类似代码的操作要容易得多。相反,因为唯一指针的所有者更容易跟踪。当阅读带有唯一指针的代码时,您可以轻松地发现生命周期应该在哪里结束以及转移到哪里。与共享的一样,不太清楚。使用唯一的指针,您可以“静态”设置边界,比如说parentObj
thing
之后无效死了,应该清楚两人的生命何时结束。如果您有共享指针,我建议您在使用parentObj
之前有一种方法在运行时检查有效性。 .
我会使用std::weak_ptr
仅当设计为parentObj
应检查 thing
的有效性在运行时,以及 parentObj
的用户无法检查 thing
的有效性。通常,代码中有一个地方,当thing
时您可以确定。和parentObj
开始和结束他们的一生。如果您有一个地方知道它们的生命周期,那么我想说该代码有责任检查 thing
的有效性。和parentObj
让这两种类型更简单。
关于c++ - 是否可以保存对shared_ptr 管理的对象的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66770747/