追踪 shared_ptr 的所有者?

问题描述 投票:0回答:3

在我们的应用程序中,我们即将(最终..)从原始指针切换到使用 C++11

smart_ptr
模板。

我们的应用程序中确实偶尔会出现错误,(非 C++)对象仍然保留对我们的 C++ 对象的引用,导致过去在访问 then-dealloc'd 对象时崩溃。

不确定这是否是一个愚蠢的问题——但是有没有一种方法可以利用

smart_ptr
对象和“dump”对象仍然保留在 C++ 对象上,而当没有任何对象被期望持有对任何对象的引用时更多?

我想我要的是一种在特定时间点列出

smart_ptr<MyClass>
的所有所有者的方法。

非常感谢任何建议!

c++ c++11 c++14 shared-ptr smart-pointers
3个回答
2
投票

没有。如果不创建自己的智能指针类来包装

std::unique_ptr
std::shared_ptr
(忽略已弃用的
std::auto_ptr
)来跟踪此信息,则无法做到这一点。 标准类本身不跟踪此信息(成本太高)。

另一种选择是修改标准库实现的代码以跟踪该信息。对 your 代码的侵入性较小,因为您可以继续使用标准名称。但可能比仅仅包装类和使用包装器更棘手。


1
投票

不要相信任何开箱即用的 c++ 智能指针都是可能的。你可以简单地包装一个 shared_ptr 来达到同样的效果。

template<typename T>
class mySmartPtr : boost::noncopyable{
    public:
         // This method should be the only way this object can be copied
         // as the copy constructors are made private
         // The newOwnerName parameter can be used to populate m_onwers.
         static mySmartPtr<T> newOwner(mySmartPtr<T>&, std::string newOnwerName); 
    private:
         std::shared_ptr<T> m_ptr;
         static std::vector<std::string> m_owners;
};

1
投票

我们的应用程序中确实偶尔会出现错误,(非 C++)对象仍然保留对我们的 C++ 对象的引用,导致过去在访问 then-dealloc'd 对象时崩溃。

如果你在你的对象上给第 3 方库组件观察者状态,那么第 3 方组件的观察者不能比你的对象活得更久是理所当然的。

这个问题有3个常见的原因:

  1. 第三方组件的生命周期管理不当(你在关闭第三方观察者之前删除了被观察的对象)

  2. 检测不当的交叉案例(导致上述 1)

  3. 在你是组件的情况下,你必须从第 3 方框架获取关于何时可以处置你的对象的命令。

在涉及

shared_ptr
s 之前,您应该首先证明 shared_ptr 可以合法地销毁对象。如果 3rd 方组件有一个“注销”方法,那么你可以通过以下方式解决这个问题:

  1. 确保第 3 方组件的所有权和您观察到的对象由相同的 shared_ptr 控制,或者
  2. 在 shared_ptr 上使用自定义删除器,在最终删除之前取消注册第三方对象上的受控对象。

如果这些都不是很清楚,那么是时候好好看看你的对象生命周期了。经常有助于绘制时序图

© www.soinside.com 2019 - 2024. All rights reserved.