- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个基类和一个派生类。 API 仅公开 Derived,而实现隐藏在 Base 中(gcc 属性 visibility
设置为 hidden
),因为一些内部 API 模块必须调用 Base 方法。这样我们得到了:
// Base.h
class Derived;
class Base
{
typedef std::tr1::shared_ptr<Derived> DerivedPtr;
public:
void doSomething(DerivedPtr aDerived);
protected:
Base();
};
// Derived.h
class Derived : public std::tr1::enable_shared_from_this<Derived>, public Base
{
public:
Derived():std::tr1::enable_shared_from_this<Derived>(), Base(){}
void doSomething(DerivedPtr aDerived)
{
Base::doSomething(aDerived);
}
};
现在是什么doSomething
做法如下:
void Base::doSomething(DerivedPtr aDerived)
{
DerivedPtr lDerived = reinterpret_cast<Derived*>(this)->shared_from_this();
}
问题如下:
std::tr1::bad_weak_ptr
异常;我正在使用 gcc-4.4.7,从回溯中我可以看到它被称为:
std::tr1::enable_shared_from_this<Derived>::shared_from_this
std::tr1::shared_ptr<Derived>::shared_ptr<Derived> (this=0x7fffffffd370, __r=std::tr1::weak_ptr (empty) 0x2)
std::tr1::__shared_ptr<Derived, (__gnu_cxx::_Lock_policy)2>::__shared_ptr<Derived>
std::tr1::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count
在__shared_count
它抛出,因为:
292 template<_Lock_policy _Lp>
293 inline
294 __shared_count<_Lp>::
295 __shared_count(const __weak_count<_Lp>& __r)
296 : _M_pi(__r._M_pi)
297 {
298 if (_M_pi != 0)
299 _M_pi->_M_add_ref_lock();
300 else
301 __throw_bad_weak_ptr();
302 }
我的 __r._M_pi 等于 0。
我知道使用 Derived
可能是个糟糕的主意在 Base
,不过这不是题材的问题,就这样吧。 (没有人可以直接实例化 Base
)。
重要的是客户端(使用 API 的人)正在使用 shared_ptr,这就是 Derived 继承 enable_shared_from_this
的原因.
我想做的是了解正在发生的事情以及为什么 bad_weak_ptr
异常被抛出,我能做些什么来避免它(可能是架构上的一些小变化)。
我改变了Base::doSomething
根据:https://stackoverflow.com/a/9377075/1498245
现在看起来像:
void Base::doSomething(DerivedPtr aDerived)
{
DerivedPtr lDerived = std::tr1::static_pointer_cast<Derived>( static_cast<Derived*>(this)->shared_from_this() );
}
它可能开始起作用了。可能吧,因为再也没有异常(exception)了,但我不太确定下面发生了什么。看起来像在 reinterpret_cast
期间有一些数据丢失。在我的真实案例中 Base
类(class)要大得多,有很多成员,等等。也许就是这样。谁能对这个案子有所了解? “幕后”发生了什么?
最佳答案
Problem is as follows:
•when I use a simple example as showed above - it works fine;
•when I use it in my big project - it throws std::tr1::bad_weak_ptr exception;
这听起来像是未定义的行为。
我想到了两种可能性(因为您没有发布测试代码和项目之间的差异,我在这里猜测):
我的第一个猜测是这段代码:
DerivedPtr lDerived = reinterpret_cast<Derived*>(this)->shared_from_this();
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
您确定仅从派生实例调用 Base::doSomething
吗?这是从层次结构的基础到派生的不安全转换。
我的第二个猜测是你正在为不是指针的东西调用 shared_from_this。我正在谈论的场景示例:
struct Foo : public std::enable_shared_from_this<Foo> {
std::shared_ptr<Foo> share() { return shared_from_this(); }
};
std::shared_ptr<Foo> pf(new Foo);
auto pf2 = pf->share(); // OK, pf2 will share ownership with pf
Foo localInstance;
auto pf2 = localInstance.share(); // NOT OK, pf2 will attempt to delete a local
// value at scope end
关于c++ - 从基类派生调用 shared_from_this() 给出 std::bad_weak_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23734388/
在尝试研究我的问题时,我已经阅读了许多有关 shared_from_this、bad_weak_ptr 异常和多重继承的堆栈溢出文章。他们都建议您从 enable_shared_from_this 继
如您所知,不可能在对象的构造函数中使用 std::enable_shared_from_this 和 shared_from_this() 对,因为包含该类的 shared_pointer 尚不存在。
我正在尝试使用 shared_from_this 函数创建指向 this 的共享指针。 #include #include class foo { public: virtual void
有时一个类需要获得一个shared_ptr对自己。实现此目的的一种方法(当您知道类的对象将始终存在于 shared_ptr 中时)是从 std::enable_shared_from_this 派生。
我正在编写具有类似 Blender 功能的基于 Qt 的应用程序。 它由一个“框架”组成,即 GUI + 插件系统和插件。插件是带有基本上可以创建和显示的对象(例如 Sphere、Box 等)的 Qt
有人能用几句简洁的话总结一下如何 boost shared_from_this<>()应该使用智能指针,特别是从使用绑定(bind)函数在 io_service 中注册处理程序的角度来看。 编辑:一些
我有一个资源管理器,就像 Andrei Alexandrescu 在 Modern C++ Design 一书中提出的那样,它遵循基于策略的设计。不过我遇到了麻烦,因为我的资源管理器需要能够通过 sh
我必须在创建容器时在容器中注册一个对象。如果没有智能指针,我会使用这样的东西: a_class::a_class() { register_somewhere(this); } 使用智能指针我
这个问题在这里已经有了答案: How to enable_shared_from_this of both parent and derived (4 个回答) 1年前关闭。 不能std::share
我有一些派生自 boost::shared_from_this 的类 - 我如何在 Qt 中执行等效的操作? (无需重新实现类似的 shared_from_this;我更喜欢无继承解决方案) 最佳答案
#include #include #include #include class A: public boost::enable_shared_from_this { typedef
我想使用 shared_from_this() 从通过引用传递的对象中获取 std::shared_ptr。但是,我希望对可能不在共享指针中或者甚至可能不是动态分配的对象保持健壮。 在调用 share
我想用一个包含不可复制成员的类来启动一个线程。为了与线程通信,我想在将对象移入线程之前从该对象创建一个共享指针。 移动构造函数是否使共享指针无效?如果是这样,那么优雅的 c++ 方法是什么?一种解决方
假设我们有一个类 Foo 定义如下: // foo.hpp class Foo; using FooCallback = std::function ins)>; class Foo : public
当从继承自 enable_shared_from_this 的类型中调用 shared_from_this 时,如果 this 当前未被 shared_ptr 对象持有(通常是应用程序崩溃),可能会发
当我这样做时出现异常:std::bad_weak_ptr->shared_from_this() template class painter_record_t { ....... private:
我想从继承自 enable_shared_from_this 的类 A 创建一个仿函数,它适用于这样的类: class A: public std::enable_shared_from_this {
在this source file有两个类:tcp_connection 和 tcp_server。在我看来,我已经选择了相关的代码位,但您可能想要引用完整的源代码以获取更多信息。 class tcp
在我的代码中,我使用 boost::threads我有一个通过名为 fnThread() 的成员函数运行线程的类.在此 fnThread() 中,我想创建一个 shared_from_this() 并
这个问题在这里已经有了答案: How to break shared_ptr cyclic reference using weak_ptr (1 个回答) 关闭 6 年前。 我有两个类,A 和 B
我是一名优秀的程序员,十分优秀!