在我们的应用程序中,我们即将(最终..)从原始指针切换到使用 C++11
smart_ptr
模板。
我们的应用程序中确实偶尔会出现错误,(非 C++)对象仍然保留对我们的 C++ 对象的引用,导致过去在访问 then-dealloc'd 对象时崩溃。
不确定这是否是一个愚蠢的问题——但是有没有一种方法可以利用
smart_ptr
对象和“dump”对象仍然保留在 C++ 对象上,而当没有任何对象被期望持有对任何对象的引用时更多?
我想我要的是一种在特定时间点列出
smart_ptr<MyClass>
的所有所有者的方法。
非常感谢任何建议!
没有。如果不创建自己的智能指针类来包装
std::unique_ptr
和 std::shared_ptr
(忽略已弃用的 std::auto_ptr
)来跟踪此信息,则无法做到这一点。
标准类本身不跟踪此信息(成本太高)。
另一种选择是修改标准库实现的代码以跟踪该信息。对 your 代码的侵入性较小,因为您可以继续使用标准名称。但可能比仅仅包装类和使用包装器更棘手。
不要相信任何开箱即用的 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;
};
我们的应用程序中确实偶尔会出现错误,(非 C++)对象仍然保留对我们的 C++ 对象的引用,导致过去在访问 then-dealloc'd 对象时崩溃。
如果你在你的对象上给第 3 方库组件观察者状态,那么第 3 方组件的观察者不能比你的对象活得更久是理所当然的。
这个问题有3个常见的原因:
第三方组件的生命周期管理不当(你在关闭第三方观察者之前删除了被观察的对象)
检测不当的交叉案例(导致上述 1)
在你是组件的情况下,你必须从第 3 方框架获取关于何时可以处置你的对象的命令。
在涉及
shared_ptr
s 之前,您应该首先证明 shared_ptr 可以合法地销毁对象。如果 3rd 方组件有一个“注销”方法,那么你可以通过以下方式解决这个问题:
如果这些都不是很清楚,那么是时候好好看看你的对象生命周期了。经常有助于绘制时序图