Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以保存对共享\u ptr管理的对象的引用?_C++_Shared Ptr_Smart Pointers - Fatal编程技术网

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