ios – 知道所有回调都与libevent和bufferevent_free一起运行

ios – 知道所有回调都与libevent和bufferevent_free一起运行,第1张

概述我正在使用libevent,版本2.0.22做一些工作,我正在努力处理bufferevent_free并确保套接字在正确的时间关闭.这是在使用 Xcode 6.4构建的iOS应用程序中,在iOS 8.4上运行. 每个套接字都由struct bufferevent管理,我还有一个数据结构跟踪该套接字的应用程序状态: bev = bufferevent_socket_new(evbase, -1, B 我正在使用libevent,版本2.0.22做一些工作,我正在努力处理bufferevent_free并确保套接字在正确的时间关闭.这是在使用 Xcode 6.4构建的iOS应用程序中,在iOS 8.4上运行.

每个套接字都由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一起运行所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1027295.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-23
下一篇2022-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存