如何在C回调中使用它时确保“this”仍然有效?

时间:2014-04-17 02:00:41

标签: c++ c callback

我有一个(可修改的)C API,它从POSIX线程调用我的C ++代码。 因为从普通C直接调用非静态成员函数是不可能的,所以我设置了一个静态包装器,它使用回调调用者提供的指针来引用类的实例,如两个other {{3非常详细questions

主要的皮塔饼(作为Java宠坏的C ++新手:)是this似乎根本不稳定。例如,如果我将刚刚注册的对象存储在带有push_back的Vector中的回调中,那么在超出范围并且只有一个副本存储在Vector中之后,好像旧对象的生命已经结束。这会产生奇特的爆炸,但这不是我想要的;)

我有哪些选项可以缓解此问题?

因为请求让我显示当前状态/问题:

std::vector<A> v;
{
    A cur(...);
    cur.set_handler(); /* to avoid leaking 'this' in the constructor */
    v.push_back(cur); /* creates a copy of cur */
} /* I presume cur is destroyed here */

A类的重要部分:

handler_t handler;

void A::set_handler() {
    handler.handle = handle_stuff_static;
    handler.user_data = this;
    add_handler(&handler); /* C function which stores the pointer for further reference (no pun intended) */
}

void A::handle_stuff_static(void *user_data) {
    if (user_data != NULL)
        static_cast<A *>(user_data)->handle_stuff_instance();
}

void A::handle_stuff_instance() { /* non-static member function */
    // hurray
}

1 个答案:

答案 0 :(得分:0)

我自己的C ++ 03解决方案,基于匿名和David Rodríguez - dribeas的评论(我实际上不能使用C ++ 11)(谢谢!)。

#include <boost/shared_ptr.hpp>

{
    std::vector<boost::shared_ptr<A> > v;
    {
        A *cur = new A(...);
        cur.set_handler(); /* to avoid leaking 'this' in the constructor */
        v.push_back(boost::shared_ptr<A>(cur)); /* creates a shared pointer pointing at cur */
    } /* the object is no longer destroyed here because of the smart pointer still in scope */
} /* the object previously pointed to by cur gets deleted when the vector gets out of scope here */