
每个套接字都由struct bufferevent管理,我还有一个数据结构跟踪该套接字的应用程序状态:
bev = bufferevent_socket_new(evbase,-1,BEV_OPT_CLOSE_ON_FREE);bufferevent_socket_connect_hostname(bev,dns_base,AF_Unspec,host,port_number);struct stream_data *data = malloc(sizeof(struct stream_data));/* initialize stream data here */bufferevent_setcb(bev,read_cb,write_cb,event_cb,data);
在一些来自其他缓冲区套接字的回调中,我认为我不需要我刚试图打开的缓冲区.这是在我得到有关bev的连接回调之前发生的.因为我用BEV_OPT_CLOSE_ON_FREE创建了它,所以我就把它释放了.然后我删除了我正在使用的数据结构.看起来像这样:
bufferevent_free(bev);free(stream_data); // the data corresponding to that bev
但是,在这种情况下,套接字实际上在此期间完成了连接.所以我的事件回调引发:
voID event_cb(struct bufferevent *bev,short what,voID *ctx){ struct stream_data *data = ctx; // data Now points to already freed memory} 而现在我已经有一个已经释放内存的指针.我已经通过调试器断点,NSLog等确认事件回调是在上面的free之后触发的.
这是预期的行为吗?如果是这样,我怎么能告诉我释放的那个错误确实消失了,这样可以安全地删除我自己的数据结构?
解决方法 是的,这是预期的libevent行为:在bufferevent_free()之后它仍然可以调用你的回调.从解放书:Bufferevents are internally reference-counted,so if the bufferevent has pending deferred callbacks when you free it,it won’t be deleted until the callbacks are done.
最简单的解决方案是在释放bufferevent对象之前删除所有回调:
bufferevent_setcb(bev,NulL,NulL);bufferevent_free(bev);总结
以上是内存溢出为你收集整理的ios – 知道所有回调都与libevent和bufferevent_free一起运行全部内容,希望文章能够帮你解决ios – 知道所有回调都与libevent和bufferevent_free一起运行所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)