C++ 是否可以保存对共享\u ptr管理的对象的引用?
这是我正在做的工作的一个版本C++ 是否可以保存对共享\u ptr管理的对象的引用?,c++,shared-ptr,smart-pointers,C++,Shared Ptr,Smart Pointers,这是我正在做的工作的一个版本 #include <memory> using namespace std; struct thing { int blah; }; struct parentObj { parentObj(thing & incomingThing) : isThisOK(incomingThing) {}; thing & isThisOK; }; int main() { shared_ptr<thin
#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);
}
#包括
使用名称空间std;
结构物{
文质彬彬;
};
结构parentObj{
parentObj(物与入物):isThisOK(入物){};
东西&isThisOK;
};
int main()
{
shared_ptr thingInstance=make_shared();
shared_ptr theObj=使_共享(*thingInstance);
}
我喜欢将共享指针指定给它的类型的引用。(ctrl+f isThisOK)
这里有没有意料之外的后果?我应该使用弱指针吗?这样也可以:
#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);
}
#包括
使用名称空间std;
结构物{
文质彬彬;
};
结构parentObj{
parentObj(物与入物):isThisOK(入物){};
东西&isThisOK;
};
int main()
{
事物存在;
shared_ptr theObj=使_共享(thingInstance);
}
就像函数参数在默认情况下应该是不可知的所有权策略,除非需要,我会说您所做的是正确的,甚至在特定情况下推荐它。如果您的对象不知道所有权策略,除非需要,这通常是一种方法
请注意两件事:
parentObj
应该被视为无效时,你必须小心你的一生,并设置一个界限std::unique\u ptr
时,执行类似于代码的操作要容易得多,因为唯一指针的所有者更容易跟踪。当读取具有唯一指针的代码时,您可以很容易地发现生命周期应该在哪里结束以及在哪里传输。有一个共享的,不太清楚。使用唯一指针,您可以“静态”设置边界,比如说,parentObj
在事物
死亡后无效,并且当两者的生存期结束时应该很清楚。如果您有一个共享指针,我建议您在使用parentObj
之前有一种在运行时检查有效性的方法我将使用
std::weak_ptr
仅当通过设计parentObj
应在运行时检查thing
的有效性,并且parentObj
的用户无法检查thing
的有效性时。通常,当thing
和parentObj
开始和结束其生命周期时,您可以确定代码中有一个位置。如果你有一个地方知道他们的一生,那么我会说,代码的责任是检查thing
和parentObj
的有效性,让这两种类型更简单。这和保存对任何其他对象的引用一样好。也就是说,编译器不会为您捕获对象生存期错误,这一负担就在您的肩上。它可以编译,但我不确定这是否是shared\u ptr
的最佳用途parentObj
对事物的引用&
不允许它知道何时访问它是有效的。您最好不要使用shared_ptr
。一个大问题是,一旦theObj
没有引用,它就会销毁其thingInstance
仍然指向的底层对象,即使它不再存在。@sanitizedUser错误,默认销毁不会销毁引用数据成员。此代码正常,但我认为您的实际代码更复杂-您必须保证,一旦thingInstance被销毁,Obj将不会使用其引用(否则您将得到UB)。您可以将std::weak_ptr传递给parentObj以防止UB