中午吃饭的时候跟同事聊天说起一个问题。说是在dll中delete在exe中创建的对象会弹出assert窗口并提醒说“堆破坏”。当时想想不太可能,回到公司后用VS2005试了一下没有出现问题。但是同事同VS2003新建了项目和工程后却出现了该问题。
具体的现象如下图所示:
断点的堆栈如下:
当时就觉得非常奇怪。到网上搜索了crtheap就有预感可能是crtheap的问题。
后来就搜到了微软的这篇文章,dll间传递CRT对象(文件句柄、环境变量、区域信息等)存在潜在问题。
进程分配内存(显式调用new,allocate,隐式分配内存比如调用strdup,strstreambuf::str等)
然后传递给DLL进行释放。都可能因为使用了不同的CRT库造成内存非法访问和栈破坏。
每一份CRT库的都有独立和唯一一份状态,并且每一份CRT库都有自己的对管理器。DLL和EXE可能使用了不同的CRT库,所以分配和释放内存的堆不能匹配从而导致了堆破坏。
修复方法:
EXE和所有的DLL都必须动态链接/MD到同一份CRT。
参考:
http://msdn.microsoft.com/zh-cn/library/ms235460.aspx
- 大小: 28.5 KB
- 大小: 57.9 KB
分享到:
相关推荐
在这个AVI解析播放器中,可能会有以下关键步骤: 1. 加载AVI文件:使用`ifstream`或其他文件操作类读取文件内容。 2. 分析RIFF结构:识别AVI chunk和sub-chunk,获取文件基本信息。 3. 解析AVI头部:提取流信息,如...
- 异常处理:为了确保程序的健壮性,解析过程中应处理可能出现的错误,如文件不存在、文件损坏等。 通过这个项目,开发者可以深入理解EXE文件的内部结构,学习如何使用C++进行二进制文件分析,同时也可以了解Visual...
本文将基于VC830L数字万用表使用说明书,深入解析其核心功能与使用方法,旨在帮助使用者充分掌握这一高效测量设备的运用技巧。 ### 一、VC830L数字万用表概述 VC830L数字万用表是由深圳市胜利高电子科技有限公司...
8. **编码与录制**:虽然描述中没有特别提到,但高级的多媒体播放器可能还包括编码和录制功能。这需要额外的编码库,如FFmpeg,它可以处理多种编码格式的编码和解码。 9. **错误处理和兼容性**:良好的播放器应具备...
在读取过程中,可能会遇到格式错误或文件损坏的情况,需要有适当的错误处理机制,如抛出异常或显示错误消息。 总之,通过VC6.0和MFC,我们可以构建一个程序来读取和显示DXF文件。这个过程涉及文件I/O、数据解析、...
源码中可能包含的类库是关键,它们可能提供了读取、解析和写入这两种格式图像的能力。对于BMP格式,类库可能包括读取文件头信息、解析颜色数据、处理位深度等功能;而对于JPEG格式,可能涉及JPEG编码和解码算法,如...
《MFC70.dll:VC6.0运行必备组件解析》 MFC70.dll,全称为Microsoft Foundation Classes 7.0动态链接库,是微软Visual C++ 6.0(简称VC6.0)开发环境中不可或缺的一个组件。在编程过程中,如果缺少这个文件,会导致...
在"vc实用播放器MP3"中,MFC可能被用来构建播放器的图形用户界面(GUI)。 3. **音频解码**: MP3是一种有损音频压缩格式,为了播放MP3文件,需要先将其解码为原始的PCM(脉冲编码调制)音频数据。这个过程通常涉及...
在电子表设计中,可能会遇到数据溢出、无效公式、文件损坏等问题,都需要有适当的错误处理策略。 通过以上这些技术的综合运用,我们可以在VC6.0环境下成功实现一个电子表应用程序。这个过程不仅锻炼了编程技能,也...
7. **错误处理**:对可能出现的播放错误进行适当的处理,如文件损坏、解码失败等,提供友好的错误提示。 通过研究这个VC开发的播放器源代码,开发者不仅可以提升对Windows编程的理解,还能深入学习到多媒体处理、...
在IT行业中,二维码(Quick Response Code)是一种二维条形码,可以存储大量信息,包括文本、网址、联系信息等,并且被广泛应用于各种场景。在VC++(Visual C++)环境中,开发二维码编解码功能是一项重要的技术。...
此外,压缩包中的`vc读取物理内存.wps`文件可能包含一个示例代码或者详细教程,可以参考其中的步骤和代码示例来理解并实现VC++读取物理内存的操作。但是,由于这里没有提供具体文件内容,我们只能根据主题给出一般性...
根据描述中提供的部分信息,这种问题可能是由于注册表中的某些设置被修改或损坏导致的。 #### 解决“Find in Files”失效的方法 为了解决“Find in Files”功能失效的问题,一种可能的解决方案是通过修改注册表。...
3. **串行通信协议**:如UART、SPI、I2C等,这些协议可能在MC与VC的通信中起到关键作用。 4. **硬件接口**:电缆两端的接口标准,如USB、UART、RS-232、JTAG等,以及它们的电气特性、引脚定义和连接方法。 5. **调试...
这份文摘可能是由一系列文章、教程或代码示例组成,旨在帮助开发者深入理解VC中的文件操作。 1. **文件I/O基础**:在VC中,文件I/O通常使用C++标准库中的fstream头文件,包括ifstream(输入流)、ofstream(输出流...
问题描述中提到的“播放AVI时是黑色的”是一个典型的视频播放错误,这可能是由多种原因导致的,包括但不限于编码解码问题、驱动程序不兼容、资源加载错误或编程实现中的bug。接下来,我们将深入探讨这些可能的原因...
在这个过程中,开发者可能使用了一些常见的C++库,如STL(Standard Template Library),其中的容器(如vector和list)和算法(如sort)可能会被用于组织和处理数据。此外,考虑到效率,可能还使用了多线程或者异步...
在VC++编程环境中,开发人员经常需要处理各种图形文件,其中GIF(Graphics Interchange Format)格式因其支持动画和小巧的文件大小而被广泛应用。"VC GIF显示控件"是专门为Visual C++(VC++)设计的一个组件,用于在...
在这个项目中,开发者可能已经实现了播放、暂停、快进、快退、音量控制等功能,并且可能支持多种视频格式。下面我们将深入探讨这个主题,了解视频播放器开发中的关键知识点。 1. **多媒体框架**:视频播放器的核心...