【问题标题】:Still Reachable Memory after all in scope pointers are Freed释放所有范围内的指针后仍可访问内存
【发布时间】:2014-03-13 05:12:37
【问题描述】:

在我的 main 函数中,我使用 new 创建了三个对象。然后我删除它们。运行 Valgrind 显示 8 字节的仍然可访问的内存。我尝试将整个 main 函数粘贴在一个循环中,以便它运行多次。它仍然只有 8 个字节。

我的主要 -

int main()
{
    settings *st = new settings();
    thread_data *td = new thread_data(st);
    client_handler *cl = new client_handler(td);

    delete cl;
    delete td;
    delete st;
}

相关的 valgrind 输出 -

==24985== 8 bytes in 1 blocks are still reachable in loss record 1 of 1
==24985==    at 0x4C2CD7B: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==24985==    by 0x4E494F9: boost::detail::get_once_per_thread_epoch() (in /usr/lib/libboost_thread.so.1.49.0)
==24985==    by 0x4E4182F: ??? (in /usr/lib/libboost_thread.so.1.49.0)
==24985==    by 0x4E41B08: boost::detail::get_current_thread_data() (in /usr/lib/libboost_thread.so.1.49.0)
==24985==    by 0x4E41D58: boost::this_thread::interruption_enabled() (in /usr/lib/libboost_thread.so.1.49.0)
==24985==    by 0x4E41D88: boost::this_thread::disable_interruption::disable_interruption() (in /usr/lib/libboost_thread.so.1.49.0)
==24985==    by 0x421854: boost::shared_mutex::lock_upgrade() (shared_mutex.hpp:195)
==24985==    by 0x423A3B: boost::upgrade_lock<boost::shared_mutex>::lock() (locks.hpp:875)
==24985==    by 0x422FA6: boost::upgrade_lock<boost::shared_mutex>::upgrade_lock(boost::shared_mutex&) (locks.hpp:766)
==24985==    by 0x41E15C: settings::load() (settings.cpp:91)
==24985==    by 0x41D796: settings::settings() (settings.cpp:34)
==24985==    by 0x40A3BB: main (main.cpp:26)

settings::load() 仅从构造函数调用一次。第 91 行是第一行 -

bool settings::load()
{
    boost::upgrade_lock<boost::shared_mutex> lock(_access);
    boost::upgrade_to_unique_lock<boost::shared_mutex> uniqueLock(lock);

我不明白内存是如何仍然可以访问的。设置对象被删除。 _access 应该在调用设置构造函数时被删除(它是设置的成员)。我尝试将 _access 更改为指针并在构造函数/析构函数中分配/删除无济于事。 升级锁在超出范围时应该被解构。

即使存在内存泄漏(据我所知,在 boost::thread(1.49 版)中没有已知错误),内存肯定会丢失吗?

我意识到这不是一个大问题,但它令人恼火(同行不会让我忘记它)

有什么想法吗?

【问题讨论】:

  • 这篇文章link 似乎相关,但我在返回之前加入了我所有的线程,所以假设他们应该在 valgrind 之前退出?特别是因为这个调用来自 main.

标签: c++ memory-leaks valgrind boost-thread


【解决方案1】:

根据Boost thread Leakage C++http://boost.2283326.n4.nabble.com/thread-Memory-leak-in-Boost-Thread-td2648030.html,这不是Boost 中的实际内存泄漏,而是Valgrind 中的问题。

IIUC 报告了泄漏,因为 Boost 在 Valgrind 无法检测到这一点时释放了内存。从第二个链接:

这真的是内存泄漏吗?

很可能不会。有问题的内存由 pthread_key_create 的删除器释放,这意味着当(主)线程退出时。 valgrind 显然在此之前进行了泄漏检查。

虽然有 discussions 关于这是否不是 Boost 错误,但我认为您不应该为您的应用程序担心这个问题:它是 (a) 一次性泄漏,不会增长并且(b) 不是由您的代码中的问题引起的。

【讨论】:

    猜你喜欢
    • 2014-03-28
    • 2020-12-28
    • 2013-06-30
    • 2018-07-02
    • 2011-07-22
    • 2021-09-17
    • 2020-06-23
    • 2011-12-14
    • 1970-01-01
    相关资源
    最近更新 更多