使用 Eigen 和 boost::thread 在 C++ 中出现奇怪的内存泄漏

Posted

技术标签:

【中文标题】使用 Eigen 和 boost::thread 在 C++ 中出现奇怪的内存泄漏【英文标题】:Strange memory leak in C++ with Eigen and boost::thread 【发布时间】:2012-07-11 23:19:27 【问题描述】:

我有两个线程在一个程序中运行。 它们是使用 boost::thread 创建的。

两个线程在内存方面不共享任何东西。它们之间不共享任何数据结构或对象。

现在第二个线程使用了一个类,该类具有许多本征双矩阵作为私有成员。 我使用 Eigen 指令 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 等确保矩阵对齐

当第一个线程运行时,第二类矩阵中的元素被覆盖。 我通过检查检查了这一点,因为应该是小数的元素突然变成了整数。 当第一个线程没有运行时,第二个线程没有问题并且其 Eigen 成员具有正确的值。

再次: 1)两个线程不共享数据结构。 2)程序运行时没有分段错误消息或类似的东西或一些错误消息。 3) 有什么建议如何保护第二个线程的内存或如何跟踪内存是如何被违反的?

提前谢谢你。我真的很抱歉我没有发布代码,但它是巨大的。 如果您希望我发布代码中的特定内容,请告诉我。

【问题讨论】:

这不是内存泄漏。内存泄漏是指已分配但未释放/删除的内存/对象。这听起来像第一个线程通过虚假指针引用内存。这通常发生在删除对象时,但程序维护了一个已失效的指向它的指针。 【参考方案1】:

您可能需要一个调试工具,例如 Mac 的 mallocguard 或 Linux 的 Electric Fence。

这些通过在分配之前添加“保护页面”来工作,将它们标记为不可访问的虚拟内存。当内存被释放时,它也被标记为不可访问。如果程序尝试访问它不应该访问的内存,修改后的分配器会确保它立即崩溃,以便您的调试器有望突出显示导致损坏的代码行。请注意,这会消耗大量内存,因此您可能需要一个小型数据集来重现损坏。

【讨论】:

以上是关于使用 Eigen 和 boost::thread 在 C++ 中出现奇怪的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

Boost::thread库的使用

使用 boost::this_thread::sleep_for() 和常规 sleep() 函数有啥区别?

Boost.Thread 的类似 CEvent 的行为

boost::thread 的线程管理和并行性

我链接到什么来定义boost :: thread_specific_ptr和相关的?

OpenMP、MPI、POSIX 线程、std::thread、boost::thread 如何关联?