本帖最后由 Jack 于 2010-8-3 18:22 编辑
完整代码:http://www.boost.org/doc/libs/1_ ... location/server.cpp
使用自定义内存分配器来分配完成键等信息.多数情况下,使用系统自定义的就够用了,但是如果效率非常高,就有必要使用.但是这个代码有一个非常隐藏的bug.在有连接的时候(也就是有session存在时),如果自然退出,就会导致访问违例...
因为handler_allocator这个对象析构后,asio_handler_allocate还会被调用,这时就会继续访问handler_allocator对象的内存,这时就会产生访问违例.
要修正这个问题也很容易:
1.不使用这个东西,因为这个东西就是分配一个完成键而已空间不大,如果效率要求不是特别特别高,完全可以不用.
2.使用单件内存池分配对象,直接custom_alloc_handler这个模板类里实现,不过得注意线程安全.(示例本身这个代码就没注意线程安全,在多线程下使用,必出问题)最好用mutex加锁下(boost的单件内存分配对象是线程安全的,无需要考虑).
3.根据asio_handler_deallocate调用规则,自己另行设计.
话说回来,这个示例只是一个示例,有bug也很正常,所以就不叫bug,但多多少少会使人误用. |