gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:35:41 24 4
gpt4 key购买 nike

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

#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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com