`
helpbs
  • 浏览: 1162747 次
文章分类
社区版块
存档分类
最新评论

跨module(exe、dll)间传递c++对象发生申请/释放内存违例的问题

 
阅读更多

即跨module(exe、dll)间申请/释放内存违例的问题,对发生在传递c++对象并使用时,不仅仅发生在std::string上

原因是由于程序中使用的内存管理多来源于crt提供的例程,而非直接使用操作系统的接口,这些例程都需要维护一些module全局数据(例如维护池、维护空闲块、或者标记已申请的块等等,不同的实现中有不同的作用),当他们被静态连编时,实际上这些“全局数据”就不“全局”了,不同的module各自为政,每份module都有自己的“全局数据”,自身的内存信息不为他人所知,module A的合法内存快自然不可能通得过module B的合法性验证

解决问题的方法有:
1、不要跨module传递c++对象,或者避免释放跨module申请的内存

2、将参与合作的module统统以multithreaded dll方式链入crt库,让他们的“全局”数据真正全局,注意,所有有交互的module都需要动态链入crt,

例子:

假如我们动态库有这样一个类class DLL接口:

SetString(std::stringstr)
{
m_str
=str;
}

在客户调用时候:

std::stringstr="wlwlxj";
DLLd;
d.SetString(str);
//此时没有深拷贝,而是引用了str内部指针地址
在调用结束的时候,dll内部删除成员变量的时候,会判断m_str内部指针合法性,由于实际分配是在调用端,在dll内部自然检查指针非法。

解决方法就是避免std::string引用计数,接口处修改为SetString(const char*),这样在dll内部分配内存,内部释放,就不会有问题。

分享到:
评论

相关推荐

    ug6.0内存违例解决方法

    rt解压后拷备ugii_simpl_chinese.lng到*\UGS\NX 4.0\LOCALIZATION目录下覆盖即可,在ug4.0和ug6.0下有效。

    BORdbk70.dll psapi.dll

    XP下,打开 delphi7 编译... Access violation at address 05F9D4ED inmodule'BORdbk70.dll',Rend of adress 00000000.的错误,delphi 也直接死掉 解决办法:文件将其中的psapi.dll解压到程序目录bin文件夹下即可解决

    DreamWeaver文件保存时提示"发生共享违例"问题分析及解决方法

    就在刚刚修改玩保存DreamWeaver文件时提示"发生共享违例"问题,很是疑惑,于是搜索了一下,把方法拿出来和大家分享,感兴趣的朋友可以了解下哦

    Think in Java(中文版)chm格式

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调...

    Java初学者入门教学

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    JAVA_Thinking in Java

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    ThinkInJava

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    java 编程入门思考

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    thinkinjava

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    Thinking in Java简体中文(全)

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    java联想(中文)

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    超爽的自学课件(java)

    1) 第1章:对象入门 这一章是对面向对象的程序设计(OOP)的一个综述,其中包括对“什么是对象”之类的基本问题的回答,并讲述了接口与实现、抽象与封装、消息与函数、继承与合成以及非常重要的多形性的概念。...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    篮球违例与犯规.doc

    篮球违例与犯规.doc

    篮球违例及犯规.doc

    篮球违例及犯规.doc

    Thinking in Java 中文第四版+习题答案

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 其他J/Direct...

    交通违例事项惩罚条例.doc

    交通违例事项惩罚条例.doc

    篮球赛24秒违例倒计时报警器的proteus仿真

    (1)具有倒计时功能。...当发生“24”秒违例时,在倒计时“24”秒结束,数码管消隐的瞬间并且立刻发出报警声“嘀-----”,且该声音时间不能太长也不能太短,只能是0.5秒左右,在3米外可听到清晰报警声。

    Thinking in Java Fourth Edition

    特变注意,这是英文版的!!!!!! 贯通此书,java天下任你驰骋 第1 章 对象入门 ...第12 章 传递和返回对象 第十三章 创建窗口和程序片 第14 章 多线程 第15 章 网络编程 第16 章 设计范式 第17 章 项目

Global site tag (gtag.js) - Google Analytics