You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS2019调用mongocxx时std<string>触发Debug断言失败求助

Debug断言失败:__acrt_first_block == header(mongocxx v3.6.5#2 + VC++)

问题重现

使用VC++开发应用,链接工具函数静态库并使用mongocxx v3.6.5#2驱动,当bson对象返回的std::string超出作用域时触发Debug断言:

Debug Assertion Failed!
Program: E:\MyApp\x64\Debug\MyApp.exe File: minkernel\crts\ucrt\src\appcrt\heap\debug_heap.cpp Line: 996
Expression: __acrt_first_block == header

最简复现代码:

// OID to_string test
#include <bsoncxx/oid.hpp>

void Oid_str(void)
{
    bsoncxx::oid idAlarmId;
    std::string sAlarmId = idAlarmId.to_string();
}

项目配置:

  • Platform Toolset: Visual Studio 2019 (v142)
  • C++ Language Standard: ISO C++14
  • vcpkg Triplet: x64-windows
  • Code Generation: /EHa, Multi-threaded Debug (/MTd)

解决方向

1. 匹配vcpkg triplet与项目运行时库

你的项目使用静态Debug运行时(/MTd),但vcpkg默认的x64-windows triplet是基于**动态运行时(/MDd)**编译的mongocxx。跨CRT模块分配/释放内存会触发堆断言,必须统一运行时:

  • 卸载现有mongocxx:vcpkg remove mongo-cxx-driver:x64-windows
  • 安装静态运行时版本的mongocxx:vcpkg install mongo-cxx-driver:x64-windows-static
  • 将项目的vcpkg triplet切换为x64-windows-static

2. 确保所有依赖库的运行时一致性

你的工具函数静态库必须和项目、mongocxx使用完全相同的运行时设置(/MTd),禁止混合静态/动态CRT,否则同样会出现跨模块内存管理冲突。

3. 反向验证问题根源

临时将项目的Runtime设置改为Multi-threaded Debug DLL (/MDd),如果断言消失,即可确认是CRT运行时不匹配导致的问题。

内容的提问来源于stack exchange,提问作者Banjolicious

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 15:03:37