我有一个(可修改的)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
}
答案 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 */