使用信号处理程序释放资源
use signal handler to release resources?
我写了一个套接字服务器。我意识到当我在运行时按 Ctrl-C 时,可能会有一些内存泄漏。我用valgrind找到了这个。
我的服务器代码非常简单。基本上,我创建一个 Listener 对象,启动一个线程以接受连接并尝试加入该线程:
try {
Server::Listener listener(1234);
boost::thread l(boost::bind(&Server::Listener::start, &listener));
l.join();
} catch(exception& e) {
cout<<e.what()<<endl;
}
当我运行valgrind时,它给了我:
==3580== 命令:bin/调试/p_rpc
==3580==
李斯特纳开始...
循环中..
^C==3580==
==3580== 堆摘要:
==3580== 退出时使用:24 个块
中的 3,176 字节==3580== 堆总使用量:28 个分配,4 个空闲,4,328 个字节已分配
==3580==
==3580== 1 块中的 288 个字节可能在丢失记录中丢失 21 个,共 24
个==3580== 在0x4C29E46: calloc (在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so
)==3580== 按0x4012084: _dl_allocate_tls (dl-tls.c:297)
==3580== 按0x4E3AABC: pthread_create@@GLIBC_2.2.5 (分配堆栈.c:571)
==3580== 按0x5260F9F: boost::thread::start_thread() (在/
usr/lib/libboost_thread.so.1.49.0 中)==3580== 按0x407B93: boost::thread::thread, boost::_bi::list1>>>(boost::_bi::bind_t, boost::_bi::list1>>&&) (thread.hpp:171)
==3580== 按0x404CA4: 主 (主.cpp:179)
==3580==
==3580== 泄漏摘要:
==3580== 绝对丢失:0 块
中的 0 个字节==3580== 间接丢失:0 块
中的 0 个字节==3580== 可能丢失:1 个块中 288 个
字节==3580== 仍然可以访问:23 个块
中的 2,888 字节==3580== 抑制:0 块
中的 0 字节==3580== 不显示可访问的块(找到指针的块)。
==3580== 要查看它们,请重新运行:--泄漏检查=完整 --显示可到达=是
==3580==
==3580== 对于检测到和禁止显示的错误计数,请使用:-v
重新运行==3580== 错误摘要:来自 1 个上下文的 1 个错误(已抑制:来自 2
个)杀
它指出可能有288字节丢失。我想我可以使用信号处理程序来释放这个资源。但我不知道我是怎么做到的。你能给我举个例子吗?
干杯埃尔顿
当进程关闭时,操作系统会自动清理进程拥有的所有内存。您无需担心程序退出时释放该内存。该建筑正在被拆除。不要费心扫地,清空垃圾桶和擦除白板。并且不要在建筑物的出口处排队,这样每个人都可以将他们的进出磁铁移出。你所做的只是让拆迁队等你完成这些毫无意义的房屋清洁任务。
您需要担心的泄漏类型是在程序生命周期内不断泄漏的泄漏类型。
原则上,您可以销毁那里的对象。在信号处理程序中可以执行的操作存在限制,并且它们与线程混合得非常糟糕。请注意,在这个区域中,编译器不能(或很少)进行检查,信号处理程序只是一个普通的函数。要格外小心。
这个问题的答案给出了一些关于如何做到这一点的细节。
- 如何跨平台将二进制资源构建到程序中?
- 使用 Bazel 编译 QT 应用程序时访问资源
- C++ 返回异常,我应该释放资源吗?
- 如何释放 googletest ASSERT_THROW语句中的函数使用的资源?
- 在不释放所有动态分配的资源的情况下结束程序是否有风险
- 提升 MPI 在侦听列表时不释放资源?
- 通过C接口分配和释放资源的正确习惯用法
- 正在从D3D挂钩释放资源
- 如何从shared_ptr资源管理器释放资源
- boost:scoped_ptr to boost::p tr_vector 而不释放资源
- 使用 C++/WinAPI 在对话窗口中释放资源的相应消息是什么?
- Qt UI生成器不会释放资源
- Curl_easy_cleanup不会释放资源
- 为什么OpenGL在创建/释放资源时使用指向资源id的指针
- 在不同的线程上安全地释放资源
- "new char[]"是否需要手动释放资源?
- 智能指针如何知道何时释放程序崩溃时的资源
- 自动释放资源的通用句柄
- 使用信号处理程序释放资源
- 用于释放资源的异常处理的替代方法