使用信号处理程序释放资源?

时间:2013-01-29 22:48:23

标签: c++ valgrind

我写了一个套接字服务器。我意识到当我在运行时按下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 / Debug / p_rpc
== 3580 ==
Listner开始......
在循环中..
^ C == 3580 ==
== 3580 == HEAP SUMMARY:
== 3580 ==在退出时使用:24块中的3,176字节
== 3580 ==总堆使用量:28个分配,4个释放,4,328个字节分配
== 3580 ==
== 3580 == 1个块中的288个字节可能在24的丢失记录21中丢失 == 3580 ==在0x4C29E46:calloc(在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
== 3580 == by 0x4012084:_dl_allocate_tls(dl-tls.c:297)
== 3580 == by 0x4E3AABC:pthread_create @@ GLIBC_2.2.5(allocatestack.c:571)
== 3580 == by 0x5260F9F:boost :: thread :: start_thread()(在/usr/lib/libboost_thread.so.1.49.0中) == 3580 == by 0x407B93:boost :: thread :: thread,boost :: _ bi :: list1&gt; &GT; &gt;(boost :: _ bi :: bind_t,boost :: _ bi :: list1&gt;&gt;&amp;&amp;)(thread.hpp:171)
== 3580 == by 0x404CA4:main(main.cpp:179)
== 3580 ==
== 3580 ==泄漏摘要:
== 3580 ==绝对丢失:0块中的0字节
== 3580 ==间接丢失:0个块中的0个字节
== 3580 ==可能丢失:1个块中的288个字节
== 3580 ==仍然可以访问:23个块中的2,888字节
== 3580 ==抑制:0块中的0字节
== 3580 ==未显示可达块(找到指针的块) == 3580 ==要查看它们,请重新运行: - leak-check = full --show-reachable = yes
== 3580 ==
== 3580 ==对于检测到的和抑制的错误计数,请重新运行:-v
== 3580 ==错误摘要:来自1个上下文的1个错误(被抑制:2个来自2个)
杀死

它指出可能有288字节丢失。我想我可以使用信号处理程序来释放这种资源。但我不知道我是怎么做到的。你能给我一个例子吗?

干杯, 埃尔顿

2 个答案:

答案 0 :(得分:2)

当进程关闭时,操作系统会自动清理进程拥有的所有内存。程序退出时,您无需担心释放该内存。 The building is being demolished. Don't bother sweeping the floor and emptying the trash cans and erasing the whiteboards. And don't line up at the exit to the building so everybody can move their in/out magnet to out. All you're doing is making the demolition team wait for you to finish these pointless housecleaning tasks.

所做的泄漏需要担心的是那些在程序生命周期内不断泄漏的泄漏。

答案 1 :(得分:1)

原则上,你可以销毁那里的物体。你可以在信号处理程序中做什么限制,它们与线程混合得非常糟糕。请注意,在此区域中,编译器可以执行 no (或非常少)检查,信号处理程序只是一个普通函数。要格外小心。

this question的答案提供了有关如何执行此操作的详细信息。