先说结论:
在MSVC/MT编译时,动态库的接口返回值尽量不要std::string
原因分析:
导致异常的根本原因是:对象在析构时不能正确释放内存
std::string是STL中定义的模板类,所以编译器在编译动态库时会将std::string实例化,在编译exe时也会将其实例化,也就是说有两套std::string实例代码分别在exe和dll中。
由于是MT编译的,在exe中并不能区分这个std::string对象的内存是不是自己的的heap中分配的,所以析构std::string对象,会调用exe中实例化的std::string析构函数代码来释放内存,然后就会抛出__acrt_first_block == header异常。
参考资料
http://www.voidcn.com/article/p-wzfrmjko-brp.html
http://blog.sina.com.cn/s/blog_4c451e0e0100u9gu.html
https://blog.csdn.net/zj510/article/details/35290505
https://blog.csdn.net/chinabinlang/article/details/80496352
https://stackoverflow.com/questions/35310117/debug-assertion-failed-expression-acrt-first-block-header