首页 > 解决方案 > 退出后分离的线程是否泄漏内存C++

问题描述

我有一个用例,我必须从自身内部停止线程。所以我想将它分离,一旦调用 stop 方法(这将完成线程的执行)。

那么它在分离后会泄漏内存吗?如果是这样,应该如何处理?

标签: c++multithreadingc++11memory-leaksdetach

解决方案


除非线程实际退出(例如returns),否则无法“停止”分离的特定线程,因此这取决于您的意思。至少,这对于标准 C++ 线程是不可能的。

如果你问一个线程是否return自动清理资源,答案是否定的——它不会。任何在其析构函数中清理资源的 RAII 对象都将被调用,但任何显式分配的内容都不会被清理,并且需要代码手动执行此操作。

如果您正在考虑类似的东西pthread_cancel,那么很可能它不会被清理,因为这是一个 C API,并且取消不会插入return执行析构函数清理的 a。我强烈建议不要做这种事情。

如果从线程“停止”实际上意味着类似std::exit,那么这取决于您使用的底层操作系统。不会运行析构函数,因此不会执行任何特定的清理代码;然而,在大多数现代操作系统上,任何使用过的资源(如开放内存)都会在程序终止时被清理。但是,有些系统不这样做(通常是专用/嵌入式 RTOS)


使用分离的线程防止任何类型的泄漏的最佳方法是能够在您希望它完成时向它发出信号,并始终使用 RAII 对象以便自动清理。

使用,您实际上可以使用std::stop_token它,但在此之前,您可以简单地从 a 设计一个同步系统,std::shared_ptr<std::atomic<bool>>并在线程中将其作为“取消点”进行查询。


推荐阅读