virsual studio 2008 跨dll释放内存,堆指针无效问题

运行时 触发了virsual studio的assert断点。输出内容如下:

HEAP[xx.exe]: Invalid Address specified to RtlValidateHeap( 00C80000, 00CACFFC )
Windows 已在 xx.exe 中触发一个断点。

其原因可能是堆被损坏,这说明 xx.exe 中或它所加载的任何 DLL 中有 Bug。

原因也可能是用户在 xx.exe 具有焦点时按下了 F12。

经过屏蔽最近的修改内容,逐渐找到原因是 传递的一个结构体中使用了string,结合以前的dll编程经验,可能是跨dll释放内存造成的。两边不同的堆内存管理机制造成,一方分配的内存在另一方不被认可。

时间: 2024-08-04 00:32:48

virsual studio 2008 跨dll释放内存,堆指针无效问题的相关文章

c++跨动态库DLL的内存分配与释放问题

先说结论: 1.如果两个DLL(或者EXE调用DLL)的CRT链接均为MD,则可以跨动态库分配和释放,如果一个是MT,另外一个是MD则会有问题. 2.利用虚函数的动态绑定技术,动态绑定分配释放内存的new和delete等,可以解决这个问题,例如shared_ptr.但如果shared_ptr包装是vector等类型,在调用和被调用中都涉及到vector的修改的话,仍然会有问题,因为两个地方都会有释放和分配. 似乎最好的办法还是用原始指针加数组长度的方式传递. 参见下面两个文章. 1.跨DLL的内

/MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题

一.MD(d).MT(d)编译选项的区别 1.编译选项的位置 以VS2005为例,这样子打开: 1)         打开项目的Property Pages对话框 2)         点击左侧C/C++节 3)         点击Code Generation节 4)         右侧第六行Runtime Library项目 2.各个设置选项代表的含义 编译选项 包含 静态链接的lib 说明 /MD _MT._DLL MSVCRT.lib 多线程.Release.DLL版本的运行时库 /

[转]System.DllNotFoundException: 无法加载 DLL“*.dll”: 内存位置访问无效。 (异常来自 HRESULT:0x800703E6)

我在使用地税发票控件进行开票的测试的时候,在xp上测试时正常的,在别人的win7系统测试也是正常,但我在我本机确不正常.我本机装的是msdn版本win7系统,这个系统比较原装. 错误信息如下: 2012-07-21 06:30:08,546 [1] ERROR - ThreadException caught System.DllNotFoundException: 无法加载 DLL"GdltaxIA.dll": 内存位置访问无效. (异常来自 HRESULT:0x800703E6).

dll的内存申请和释放问题--Debug程序正常而Release程序崩溃

C++编程中经常遇到这样的需求:主函数需要调用一个功能函数并返回一块大小不定的存储着处理结果的内存,这时容易想到两种选择:一是使用vector类型的引用作为形参,无需考虑内存问题:二是使用指针,在主函数中定义指针,而在功能函数中申请内存.这两种处理方法本来没有问题,但如果功能函数是dll中的函数,那么就需要十分小心了. 下面我们直接上结论: 1. 如果使用vector类型作为dll库函数的形参,那么一定不能在库函数中更改vector的大小,而只能更改vector的内容: 2. 如果使用指针,且在

在dll里malloc/new/cvCreate分配内存,在exe里free/Releases释放内存时会出错。

写了个程序,在DLL中用malloc分配了一块内存,但是在exe程序中释放,结果程序crash,原因就是:其原因可能是堆被损坏,这也说明 TestMySticker.exe 中或它所加载的任何 DLL 中有 bug. 以下文字引用自 http://hi.baidu.com/huhe/blog/item/0b422edd1f1563d98c1029a3.html 一个模块一个堆,一个线程一个栈. dll里malloc的内存,在exe里free会出错. CRT(C运行时期库)不是使用进程缺省的堆来实

windows server 2008 大量拷贝后释放内存

管理的服务器中有一台windows 2008,这台服务器最近每天都会拷贝几十万的图片,拷贝量非常大,维护时发现每次拷贝完,操作系统的内存使用都会接近100%,导致没有办法进行其它操作,前几次都通过下班后重启服务器解决,今天仔细查了一下,找到了问题的原因 问题描述: server 2008 r2系统会在进行大量IO操作时,占据大量内存资源,直至内存占满,从而导致系统运行速度变慢. 相关现象:1. 内存占用率90%以上(即是是64G内存,也会占用63.5G)2. 资源管理器中所有进程内存和较低(约1

内存申请和释放及堆连续

glibc 内存申请和释放及堆连续检查 C语言有两种内存申请方式: 1.静态申请:当你声明全局或静态变量的时候,会用到静态申请内存.静态申请的内存有固定的空间大小.空间只在程序开始的时候申请一次,并且不再释放(除非程序结束). 2.自动申请:当你声明自动变量的时候会使用自动申请.函数参数.局部变量都属于自动变量.这些变量空间在程序执行致相关语句块申请,离开语句块时释放. 还有一种内存申请方式:动态内存申请.C语言变量并不支持动态内存申请,这一功能由库函数实现.C里面没有动态这个存储类型!! 当你

C++在堆上申请和释放内存 - new & delete

// 动态申请内存, 指向一个未初始化的整型 int *pi = new int; // pi指向一个整型值,初始化为0 int *pi = new int(); // value of i is 1024 int i(1024); // pi指向1024 int *pi = new int(1024); // value of  s is "99999" string s(5, '9'); // *ps is "999999" string *ps = new s

跨函数使用内存空间

所谓动态内存分配(Dynamic Memory Allocation)就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法.动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小.凡是在程序中用到系统提供的动态分配存储空间函,均要求包含头文件<malloc.h>. Malloc 向系统申请分配size字节的存储区.返回分配内存空间的起始地址,若分配失败,则返回0,类型是 void* (或chaar*).ma