• 在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,是微软编译器的实现问题。
  • 所以,这个问题的解决办法就是:

    1. 设置dll和exe的运行库为动静链接(/MD)。
    2. 让dll的接口不要返回std::string。
    3. 应用toLocal8Bit替换toStdString。例如,将

      std::string fs = qsFilter.toStdString();

      批改为

      std::string fs = std::string(qsFilter.toLocal8Bit());