毕竟在范围指针中仍然可以访问内存是Freed

时间:2014-02-14 01:36:13

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

在我的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更改为指针&amp;在构造函数/析构函数中分配/删除无济于事。 当超出范围时,应解构升级锁。

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

我意识到这不是一个主要问题,但这是一种烦恼(同伴不会让我忘记它)

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

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

IIUC报告泄漏是因为当Valgrind无法再检测到这种情况时,Boost释放了内存。从第二个链接:

  
    

这真的是内存泄漏吗?

  
     

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

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