VS2013、VS2005都是MD,跨dll使用stl的string崩溃问题

来源:互联网 发布:双轮矩阵图 编辑:程序博客网 时间:2024/05/01 19:03

何志丹

VS2013和VS2015的工程选项都设置成MD。

VS2005编一个dll,有一个类CTest,有一个私有的std::string类型的成员变量。
VS2013的exe 中CTest test 没有使用test。
崩溃,原因:堆栈溢出。
经查:
VS2013中, sizeof(std::string) 24
VS2005中,sizeof(std::string) 28
故原因是:
VS2013 为test分配24个字节,VS2005调用std::string(需要28字节)的构造函数和析够函数。于是破坏了堆栈。
根本解决办法:
不使用VS自带的stl,使用统一的stl。
指标不治本的办法:
CTest的成员变量由std::string改成std::string*。

最常见的办法是:
用同一个版本的VS编译。

注意:std::vector也有类似问题。
dll的string赋值给exe的string也可能有问题,因为两者的内存结构不一样。

0 0
原创粉丝点击