0

有人能解释一下为什么这种和平的代码会产生内存泄漏吗?

Boost 1.49 和 boost-1.53​​ 给出了相同的结果....

#include <boost/thread.hpp> 
#include <iostream> 
#include <vector> 
#include <cstdlib> 
#include <ctime> 

boost::mutex mutex; 
boost::condition_variable_any cond; 
std::vector<int> random_numbers; 

void fill() 
{ 
  std::srand(static_cast<unsigned int>(std::time(0))); 
  for (int i = 0; i < 3; ++i) 
  { 
    boost::unique_lock<boost::mutex> lock(mutex); 
    random_numbers.push_back(std::rand()); 
    cond.notify_all(); 
    cond.wait(mutex); 
  } 
} 

void print() 
{ 
  std::size_t next_size = 1; 
  for (int i = 0; i < 3; ++i) 
  { 
    boost::unique_lock<boost::mutex> lock(mutex); 
    while (random_numbers.size() != next_size) 
      cond.wait(mutex); 
    std::cout << random_numbers.back() << std::endl; 
    ++next_size; 
    cond.notify_all(); 
  } 
} 

int main() 
{ 
  boost::thread t1(fill); 
  boost::thread t2(print); 
  t1.join(); 
  t2.join(); 
}

这是 valgrind 的输出:

valgrind --leak-check=full --show-reachable=yes ./a.out

==3079== Memcheck,内存错误检测器

==3079== 版权所有 (C) 2002-2011 和 GNU GPL,由 Julian Seward 等人提供。

==3079== 使用 Valgrind-3.7.0 和 LibVEX;使用 -h 重新运行以获取版权信息

==3079== 命令:./a.out

==3079==

值:535293148

值:1979778795

值:1888522902

==3079==

==3079== 堆摘要:

==3079== 在退出时使用:1 个块中的 8 个字节

==3079== 总堆使用量:16 次分配,15 次释放,1,732 字节分配

==3079==

==3079== 1 个块中的 8 个字节在丢失记录 1 of 1 中仍然可以访问

==3079== 在 0x4C2B3F8:malloc(在 /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so 中)

==3079== by 0x4E45BF9: boost::detail::get_once_per_thread_epoch() (在/usr/local/lib/libboost_thread.so.1.53.0)

==3079== 0x4E3F861:_ZN5boost9call_onceIPFvvEEEvRNS_9once_flagET_.constprop.239(在 /usr/local/lib/libboost_thread.so.1.53.0 中)

==3079== by 0x4E3F978: boost::detail::get_current_thread_data() (在/usr/local/lib/libboost_thread.so.1.53.0)

==3079== by 0x40A909: boost::detail::interruption_checker::interruption_checker(pthread_mutex_t*, pthread_cond_t*) (在/u00/system/workspace/shared_lock2/src/a.out)

==3079== by 0x4E40502: boost::thread::join_noexcept() (在/usr/local/lib/libboost_thread.so.1.53.0)

==3079== by 0x40ACAE: boost::thread::join() (在/u00/system/workspace/shared_lock2/src/a.out)

==3079== by 0x4092B0: main (in /u00/system/workspace/shared_lock2/src/a.out)

==3079==

==3079== 泄漏摘要:

==3079== 肯定丢失:0 个块中的 0 个字节

==3079== 间接丢失:0 个块中的 0 个字节

==3079== 可能丢失:0 个块中的 0 个字节

==3079== 仍然可达:1 个块中的 8 个字节

==3079== 抑制:0 个块中的 0 个字节

==3079==

==3079== 对于检测到和抑制的错误计数,重新运行:-v

==3079== 错误摘要:来自 0 个上下文的 0 个错误(抑制:2 个来自 2)

此来源是来自http://en.highscore.de/cpp/boost/的 cpp 书的一部分

4

0 回答 0