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
相关产品推荐
相关产品推荐

