何志丹

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

VS2013、VS2005都是MD,跨dll使用stl的string崩溃问题的更多相关文章

  1. MFC exe使用C++ dll中的std::string 崩溃

    VC6中 MFC exe中 new  纯C++ dll dll 崩溃 我把纯C++的 dll,用/MTd 换成/MDd.就能够了

  2. C++ 跨dll传递string类型参数执行出错问题

    今天遇到一个问题,在一个dll工程中定义了一个返回值为string,参数为string的函数,然后在一个测试工程中调用,Release模式下一切正常Debug模式下整个函数的执行到return之前都毫 ...

  3. C++中string跨DLL失败解决途径

    1.问题描述: 在一个MFC应用程序exe中,调用另一个DLL中的函数,函数中的一个形参是string类型的,每次调用都会出现乱码的情况. 调用前: 调用后: 2.原因分析: 不同的模块各自有一份C运 ...

  4. 跨DLL操作fopen的返回值导致出错

    在设置成/MD或/MDd不会导致出错 设置成/MT或/MTd的情况下会导致出错 看了CRT的实现,估计是因为fopen创建了CriticalSection来保护文件,但是在/MT的情况下,一个DLL里 ...

  5. STL跨DLL使用

    今天在写一个函数,需要将map作为一个引用参数传入函数体内部进行赋值,结果编译通过,执行时总是崩溃,在网上找到了一些作者写的blog,详细解释了这种情况发生的原因,特转载在这里,便于自己今后查询. 原 ...

  6. Windows下VS2013创建与使用动态链接库(.dll)

    一.创建动态链接库文件 ** 1.打开VS2013,选择文件,新建工程  2.选择新建W32控制台应用程序,这里将工程名改为makeDLL  3.在应用程序类型中选择DLL,点击完成  4.完成以上步 ...

  7. 用InstallShield 打包工具 打 Win32 程序 (depends.exe 用看程序都依赖了哪些dll)

    InstallShield 打包工具 1. 转载:http://blog.csdn.net/zhang_xinxiu/article/details/9099757 2. 转载:http://www. ...

  8. C++ 解析Json——jsoncpp

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,和xml类似,本文主要对VS2008中使用Jsoncpp解析json的方法做一下记录.Jsoncpp是个跨 ...

  9. C++ 解析Json——jsoncpp(转)

    原文:https://www.cnblogs.com/liaocheng/p/4243731.html JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,和 ...

  10. VS2005环境下的DLL应用

    VS2005环境下的DLL应用 作者:一点一滴的Beer http://beer.cnblogs.com/ 以前写过一篇题为<VC++的DLL应用(含Demo演示)>的文章,当时是刚开始接 ...

随机推荐

  1. POLIR-Laws-民法典: 第 5 章: 民事权利

    POLIR-Laws-民法典: 第 5 章: 民事权利 第五章  民事权利 第一百零九条  自然人的人身自由.人格尊严受法律保护. 第一百一十条  自然人享有: 生命权.身体权.健康权. 姓名权.肖像 ...

  2. linux下.tar.gz如何解压--九五小庞

    1)使用命令 tar -xzvf XXX.tar.gz 如果解压出现 gzip:stdin:not in gzip format tar:Child returned status 1 tar:Err ...

  3. win10专业版点击右键无法弹出菜单的问题

    一位雨林木风系统的小伙伴遇到在win10专业版电脑里面点击鼠标右键没有弹出菜单,想点击刷新都没办法了,应该怎么解决呢?接下来,雨林木风小编就来分享具体的处理方法,一起来看看吧. 如果 Windows ...

  4. Win10专业版电脑如何创建本地账户的问题

    有电脑系统用户,说他用的电脑win10专业版系统,要如何才能创建一个本地账户来使用呢?下面,电脑技术员小编就来详细的介绍一下具体的操作方法吧! 在 Windows 10 中创建本地账户可以按照以下步骤 ...

  5. [J组模拟赛 #002 T4]分组选数

    分组选数 题目大意: 给 \(n\) 个数,第 \(i\) 个数是 \(a_i\),属于第 \(b_i\) 个集合中.对于每个集合,若从中选出若干个数,则价值为这些数的异或和,总共的价值就是所有集合的 ...

  6. Ubuntu 18.04 开机自启 某命令脚本

    1.mv xx.sh /etc/init.d 2.chmod 777 xx.sh 4.sudo update-rc.d xx.sh defaults 90 # 90为优先级,越高执行的越晚 5.sud ...

  7. 2025可信数据库发展大会召开,天翼云TeleDB领航核心系统创新实践!

    近日,"2025可信数据库发展大会"在北京隆重召开.作为数据库产业的重要建设者,天翼云受邀出席,联合中国信息通信研究院及中国通信标准化协会大数据技术标准推进委员会(CCSA TC6 ...

  8. raid技术与应用(一)

    raid的实现方式:硬件raid卡和软件raid 特点:更有效的数据组织方式,条带和并行.数据保护功能,校验和热备 raid数据组织方式:分块和条带 raid校验方式:XOR的校验算法,相同为假,相异 ...

  9. VS+QT5.8.0+QWebEngineView注意事项

    1.添加qwebengineView模块项目右键->属性 选择Qt Project Settings,在Qt Modules中添加模块webenginewidgets,模块间以逗号分隔. 2.调 ...

  10. LiveGBS GB28181国标流媒体对几万路摄像头接入时如何配置切换成Mysql_Mariadb数据库

    GB28181流媒体服务 LiveGBS具体介绍这边不多说,参考https://www.liveqing.com/docs/products/LiveGBS.html 配置接入mysql数据库 Liv ...