YOU0324 2025-07-22 10:53 采纳率: 60%
浏览 21
已结题

std::lock_guard<std::mutex> lock(_saveMapLock)报错

std::lock_guardstd::mutex lock(_saveMapLock)
这一行代码报错 报错信息是下面这个

img


std::lock_guardstd::mutex lock(_saveMapLock);
_saveMapLock 是unlock状态 执行代码之后为什么会出现0x000007FEF36EAA38 (msvcp140.dll)处(位于 MapExplorer.exe 中)引发的异常: 0xC0000005: 读取位置 0x0000000000000000 时发生访问冲突。
问题出现:打包完在其他电脑上运行报错 本地调试没有任何问题
项目说明:原来项目中的代码不会报错 在添加完打包成dll的notepad++源码的时候出现这个问题 notepad++ dll程序没有问题能正常打开显示
通过按键触发问题代码就出现了报错(原项目是QT类型,notepad++就是github上的源码)
可能的原因有没有人解释一下:1.notepad++项目打包成dll是debug 但是QT原项目打包时release 2. notepad++ 中也使用了类似的代码如std::lock_guardstd::mutex lock(mark_mutex)
搞一天了 希望有人能提供一点思路

  • 写回答

7条回答 默认 最新

  • YOU0324 2025-07-22 11:20
    关注

    解决了兄弟们,在预处理器定义那里添加下面一行
    _DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR=1
    试一下能不能解决 不能解决的话还需要进行排查 我的问题在添加这一行之后就没事了 这个代码的作用如下
    编译器兼容性:某些较旧的编译器或工具链可能不完全支持 C++20 的 constexpr 特性,禁用后可避免编译错误。
    性能或代码生成:在极少数情况下,constexpr 构造函数可能导致意外的代码膨胀或性能问题。
    依赖库限制:如果项目依赖的第三方库不支持 constexpr 构造的互斥锁,禁用此特性可确保兼容性。
    代码的使用场景如下
    跨平台代码:当代码需要同时在支持和不支持 C++20 的编译器上编译时。
    混合版本项目:项目中部分代码使用旧版 C++ 标准,而其他部分使用 C++20 或更高版本。
    调试或性能优化:在特定环境下测试禁用 constexpr 构造函数是否影响程序行为或性能。
    C嘎嘎还有很长的路要走 加油少年

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 8月2日
  • 已采纳回答 7月25日
  • 创建了问题 7月22日