何志丹

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也可能有问题,因为两者的内存结构不一样。

posted on   闻缺陷则喜何志丹  阅读(13)  评论(0编辑  收藏  举报  
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~



点击右上角即可分享
微信分享提示