libuv释放handle占用内存的时机

只能在uv_close之后的uv_cb中对handle内存进行释放。

因为uv_close本身只是将handle代释放队列,倘若释放时遇到某些异步处理(如:uv_write)需要失败回调通知,将会继续调用对应的回调,此时再访问handle和可能因内存访问coredump。

 

void TcpHandler::bind(uv_loop_t& loop){
    tcp = Holder<uv_tcp_t, TcpHandler>::create(std::static_pointer_cast<TcpHandler>(shared_from_this()));
    uv_tcp_init(&loop, tcp.get());
    tcp->data = this;
}
void TcpHandler::unbind() {
    uv_close((uv_handle_t*)(tcp.get()), [](auto* handle){
    auto tcpHandler = getHandler((uv_tcp_t*)handle) ;
    tcpHandler->tcp = nullptr;
    });
}

  

posted @ 2021-11-18 22:56  dzqabc  阅读(206)  评论(0编辑  收藏  举报