gpt4 book ai didi

c++ - 对 boost::smart_ptr 的引用指向对象并检查它们的有效性

转载 作者:太空宇宙 更新时间:2023-11-04 16:31:24 25 4
gpt4 key购买 nike

鉴于以下情况:

class Curve {
public:
typedef boost::shared_ptr<Curve> Pointer;
// ...
private:
// ...
};

class CurveShift: public Curve {
public:
CurveShift(const Curve & curve);
// ...
private:
const Curve & curve_;
// ...
};

我想知道当您想执行以下操作时是否有一致的最佳实践:

Curve::Pointer pointer(new Curve());
SomeGlobalRepository::Add("key", pointer);

在其他地方你有:

CurveShift cs(*SomeGlobalRepository::Get("key"));

你真的不能保证 SomeGlobalRepository将包含原始 Curve::Pointer什么时候CurveShift将需要它,因此 curve_可能指向释放的内存,甚至是已经重新分配给其他东西的内存。我相信一种可能的解决方案是 CurveShift使用 boost:weak_ptr<Curve>而不是 const Curve & , 但我很确定这意味着你不能使用 Curve不再在堆栈上,任何实例都必须进入堆(构造函数变为私有(private)并且对象通过工厂创建)。是否有更好的策略来实现所需的行为?我的直觉是,虽然从理论上讲这可能是一个严重的问题,但实际用例不会造成这些棘手的情况。

最佳答案

我在您的评论中注意到您在堆栈上分配了一个对象,您想要一个 std::shared_ptr到...如果是这种情况,您必须将对象从堆栈复制到堆中,执行如下操作:

std::shared_ptr<my_object_t> sh_ptr(new my_object_t(stack_object));

然后将在堆上分配堆栈对象的拷贝并创建一个 std::shared_ptr从那个堆分配的对象。然后,您可以将新创建​​的共享指针复制到容器中,等等。

此外,我同意 Nemo 的意见,即您应该上课 CurveShift保留一份 shared_ptr而不是对 Curve 的常量引用类对象...那样shared_ptr对象将控制指针引用的生命周期,如果容器或其他对象试图破坏 shared_ptr 指向的内存实例在它自己的解构期间,内存引用仍将保留在 CurveShift 中。自调用 shared_ptr 的析构函数以来的实例其他地方实际上不会将堆上对象的内存释放为您的 CurveShift实例对象具有对 shared_ptr 持有的堆分配对象的事件引用.通过仅保留一个常量引用,您可以消除使用 shared_ptr 的全部优势。通过某种形式的引用计数控制堆上分配的对象的解构类型。

最后,我会这样写你的课:

class CurveShift: public Curve {
public:
CurveShift(const shared_ptr<Curve>& ptr): _curve(ptr)
{
// ... rest of constructor
}

private:
shared_ptr<Curve> curve_; //will remain valid for lifetime of CurveShift instance
// ...
};

然后你会像这样打电话:

CurveShift cs(SomeGlobalRepository::Get("key"));

shared_ptr中的哪些拷贝给你的CurveShift实例并增加对其管理的堆上指针的引用计数。

关于c++ - 对 boost::smart_ptr 的引用指向对象并检查它们的有效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6512542/

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