- 在Windows下使用VS开发QT程序,如果使用了函数toStdString来将QString转换为std::string的时候,可能会发生崩溃,报错__acrt_first_block == header。
- 这种崩溃会发生在vs项目的运行库设置为静态链接(/MT)时,如果运行库设置的是动态链接(/MD)则不会有问题。
- 这个崩溃的根本原因是对象在析构时释放内存不正确。std::string是STL中定义的模板类,所以编译器在编译dll时会将std::string实例化,在编译exe时也会将其实例化。当设置运行库为静态链接(/MT)时,dll和exe都有自己独立的heap内存。函数toStdString会返回一个std::string,这个std::string是在dll的内存中分配的,当其在exe中被释放时就会抛出__acrt_first_block == header的异常。
- 这个问题在QT的官方bugreports里也有人反馈——QString::toStdString() bug——按照官方的说法这不是QT的bug,是微软编译器的实现问题。
- 所以,这个问题的解决方法就是:
- 设置dll和exe的运行库为动态链接(/MD)。
- 让dll的接口不要返回std::string。
- 使用toLocal8Bit替换toStdString。例如,将
修改为std::string fs = qsFilter.toStdString();
std::string fs = std::string(qsFilter.toLocal8Bit());
解决QT程序异常中止,报错__acrt_first_block == header
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 1 实验目的 目前计算机视觉技术已经比较成熟,相关的开源项目与算法很多,可以将这些开源算法进行整合,进而做成一个小...
- 问题: 背景: 工作中开发的CookieTool工具是一个MFC的程序,如果选择以共享dll中使用MFC的方式,那...
- 2016年国庆假期终于把此书过完,整理笔记和体会于此。 关于书名 书名源于俄罗斯的演员斯坦尼斯拉夫斯基创作的《演员...