有人能解释一下为什么这种和平的代码会产生内存泄漏吗?
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)