c++ - 内存在分配 block 之前被破坏

标签 c++ multithreading gcc memory-management

经过几天痛苦的调试,我可以用这个小程序重现我的一个单元测试中的错误:

#include <iostream>
#include <vector>
#include <condition_variable>
#include <mutex>
#include <thread>
#include <chrono>
#include <new>

int main(){
    try{
        for(size_t j=0;j<100;++j){
            std::cout<<j<<std::endl;
            std::mutex mutex;
            std::unique_ptr<std::condition_variable>cv;
            std::vector<std::thread>v(10);
            auto wait=[&](size_t i){
                std::unique_lock<std::mutex>ul(mutex);
                if(!cv){cv=std::make_unique<std::condition_variable>();}
                cv->wait_for(ul,std::chrono::milliseconds(i*10));
            };
            for(size_t i=0;i<v.size();++i){v[i]=std::thread(wait,i);}
            for(size_t i=0;i<v.size();++i){v[i].join();}}}
    catch(...){
        std::cout<<"Exception"<<std::endl;
        std::abort();}
}

当我使用 lmcheck 进行编译时:

g++-4.9.2 -lmcheck -std=c++1y -pthread /home/Arnaud/Test.cpp -o Test

程序运行和停止时内存在分配的 block 之前被破坏

我可以在多台机器上使用 gcc 4.9.2 和 gcc 5.1 重现它。 这段代码有什么问题?

注意:此代码在 Visual Studio 2013 中运行良好。

最佳答案

根据 this documentation , mcheck 不是线程安全的。

看起来与 -lmcheck 的链接添加了调用 mcheck 的分配 Hook ,这意味着在没有额外同步的情况下从多个线程分配和释放内存不再安全。

关于c++ - 内存在分配 block 之前被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29894916/

相关文章:

c++ - 如何在 std::queue 中存储 char 缓冲区

java - 等待/通知 vs sleep /中断 vs ReentrantLock.Condition

Java 将负载平衡到许多 JVM 中

c - Makefile 只执行一次命令

c++ - 如何构建独立于编译器的 C++ 库(适用于 Solaris Studio 和 gcc)?

c++ - qPicture::play 函数有什么作用?

c++ - tbb GettingStarted 示例未编译

c++ - 如何将闪存驱动器设置为只读?

字符数组 vector 上的 C++ GCC 4.3.2 错误

c++ - gcc 或 makefile 是否有一种机制可以描述源文件的包含文件以替换 #include "xxxx.h"?