• (转)Debug Assertion Failed! Expression: _pFirstBlock == pHead


     

    最近在VS上开发C++程序时遇到了这个错误:

    Debug Assertion Failed! Expression:_pFirstBlock == pHead

    如图

    点击Abort之后,查看调用栈,发现异常在函数return时被时产生,进一步看是vector的析构函数被调用时产生,以前没开发过C++项目,没什么经验,这个错误让我很困惑,第一,我电脑上并没有f盘;第二,我并没有调用析构函数;第三,这到底是个什么错误

    第一个问题,大概是一个虚拟的分区吧,第二个问题,我的vector变量是在一个函数体内部声明使用的,函数返回的时候,自动变量生命期结束,C++应该会调用vector的析构函数来释放这个对象,就在这个时候发生了异常

       

    关于第三个问题,我在网上查了一些资料,发现大概有以下几种情

       

    混淆了 DebugRelease情况,有时DebugRelease所需要的库是不一样的,如果你只导入了Release的链接库,而没有导入Debug的链接库,而编译运行时又选择了Debug模式,就可能出现这种问题,这时要把Debug的链接库添加进去可能就会解决

       

    可能是在一个多线程模块了运行了一个单线程库,内存在dll一侧被分配,在使用一侧被释放,可能导致一个内存管理器在分配内存,另一个内存管理器在释放同一片内存区域,导致错误

    C++STL是单线程的,我在函数内部使用了vector,这个函数在一个多线程的环境里,大概就是这个错误产生的原因

    一个解决方式就是设置运行库 /MDd

    工程上右键-》属性-C/C++=》所有选

     

    关于运行库几个参

    多线程(/MT)
    多线程调试(/MTd)
    多线程 DLL (/MD)
    多线程调试 DLL (/MDd)

    名字后带d的是debug,名字含D是动态链接,含T是静态链


    C
    运行时库                                         库文件
    MultiThread(static link)MT                     libcmt.lib
    Debug multiThread(static link)MTd           libcmtd.lib
    MultiThread(dynamic link)MD                  msvert.lib
    Debug multiThread(dynamic link) MDd      msvertd.lib 

       

    另:使用std::string时产生这个错误的解决方法

    http://stackoverflow.com/questions/18882760/debug-assertion-failed-expression-pfirstblock-phead

     

    来自: http://blog.csdn.net/giantpoplar/article/details/47295877

     

    我的一个项目在Debug的时候出现问题,用Release编译了一下,修复了Release配置中引入有问题的lib,编译通过后,运行Release版本就解决了。

  • 相关阅读:
    docker 入门9篇文章
    shell获取 linux 系统的位数
    docker 查看容器详细
    VirtualBox 运行失败
    export 命令 设置环境变量
    查看内核启动顺序 设置默认启动内核
    生成 git 密钥 步骤
    初始化 二维数组
    关于开发环境 git 重新部署
    git-版本管理工具的介绍+发展史+分布式版本控制系统和集中式版本控制系统的区别
  • 原文地址:https://www.cnblogs.com/time-is-life/p/7019064.html
Copyright © 2020-2023  润新知