【发布时间】:2013-06-28 14:22:23
【问题描述】:
我为 OpenWrt 开发了一个多线程缓存代理(Linux 用于路由器,因此可用的 RAM 很少)。我使用了 Boost 和 Curl 库,它运行良好,但它的 RAM 消耗并没有停止增加(内存泄漏)。
- 我释放了所有动态分配的变量
- 我关闭了所有打开的文件
- 清理初始化的 curl 句柄
- 全局变量是常量
这是我的主要代码的一部分:
while (true) {
ip::tcp::socket* socket = new ip::tcp::socket(io_service);
acceptor.accept(*socket);
pthread_t thread;
pthread_create(&thread, NULL, handleRequest_thread, (void*) socket);
pthread_detach(thread);
}
内存泄漏肯定是“handleRequest_thread”发生的,所以我的问题是: 线程完成后有没有办法释放所有资源(内存、打开的文件...)?
【问题讨论】:
-
您可能拥有分配线程本地内存的库,这取决于库的实现并不总是被破坏。尝试将您的程序转换为使用线程池来回收线程。 OpenMP 通常会自动执行此操作。您可以使用 OpenMP 任务构造来获得与
pthread_create相同的效果。 -
只使用一个线程后,我的应用程序消耗的内存更少,但它仍然随着时间的推移而增加:-(,我认为问题出在 libcurl
-
对于内存限制的嵌入式设备来说,每个套接字使用一个线程似乎是不必要的开销。为什么不使用单个线程调用
io_service和异步方法? -
我没有尝试过异步编程,而且我有时间完成这个项目:)
-
我建议在您的问题中包含更多代码来演示内存泄漏。
标签: c++ c memory-leaks boost-asio libcurl