以下C++ SDK异步消息处理程序通过swig封装为python后,运行python进程产生了coredump
// 提供给用户的接口。用户可自定义应答函数的实现
class UserSpi
{
public:
virtual void OnConnect(){};
virtual void OnLogin(const std::vector<LoginRsp>& rspList){};
}
// 提供给用户的API,用户通过API连接服务端
class UserApi
{
public:
static UserApi* CreateApi();
virtual void Release() = 0;
virtual void Connect() = 0;
virtual int RegisterSpi(UserSpi* spi) = 0;
virtual void Login() = 0;
}
// Callback 为第三方通信库,能与服务端进行异步通信
class Callback
{
// 建立连接
virtual void Connect() = 0;
// 函数返回后 msg 立即被释放
virtual void OnMsg(Message* msg) = 0;
};
// SDK protobuf消息处理,继承了消息处理库
class Recv : public CS::Callback
{
public:
virtual void Connect() override
{
m_spi->Connect();
}
void OnMsg(Message* msg) override
{
if (msg->GetUrl == "Login")
{
OnLogin(msg, requestId);
}
}
// 异步登录应答处理
void OnLogin(Message* msg)
{
std::vector<LoginRsp> rsp;
// 解析服务端返回的消息,填充到 rsp 中。此处代码省略。
// 进入OnLogin的python warp函数内产生了空指针,导致coredump
m_spi->OnLogin(rsp);
}
private:
UserSpi* m_spi;
}
调用栈如下: