今天碰到一个比较棘手的内存处理问题。
首先来看一个数据结构:
typedef struct _IRP_AND_FILTER
{
PIRP pIrp;
PMS_FILTER pFilter;
ULONG OutputBufferLength;
}IrpAndFilter, *PIrpAndFilter;
其中pIrp是一个IRP指针,pFilter指的是一个Filter Driver的实例,最后一个数字式OutputBuffer的长度。接着看代码:
pIrpFilter = (PIrpAndFilter)NdisAllocateMemoryWithTagPriority(pFilter->FilterHandle,sizeof(IrpAndFilter),FILTER_ALLOC_TAG, LowPoolPriority);
if(pIrpFilter != NULL)
这里为这个结构分配了一个size为sizeof(IrpAndFilter)的空间。谁分配,谁释放的原则告诉我们等资源不再使用的时候需要释放。现在的问题是:pIrp在内核的调度函数执行完毕,调用IoCompleteRequest(pIrp, IO_NO_INCREMENT);之后仍然不能释放,因为里面还有一个OutputBuffer的数据需要传递给User层,而且估计会在程序关闭时Cleanup,释放这些资源。然后是pFilter这个是指向Filter实例的指针,用完也不能释放,因为其他部分程序会使用到,而且最后程序在FilterDetach()释放该资源,现在只剩下OutputBufferLength,这个用完就可以释放了。所以纠结的是现在这个资源怎么办啊?接着看这个资源是如何使用的:
Status = PsCreateSystemThread(&threadHandle,
THREAD_ALL_ACCESS,
NULL,
NULL,
NULL,
(PKSTART_ROUTINE) sendMyOwnPacketThread,
pIrpFilter
);
以线程的方式传给sendMyOwnPacketThread函数,然后:
VOID
sendMyOwnPacketThread(
IN PIrpAndFilter pIrpAndFilter
)
{
NTSTATUS Status;
//拿到这些资源
pFilter = (PMS_FILTER)pIrpAndFilter->pFilter;//get current filter instance
pIrp = (PIRP)pIrpAndFilter->pIrp;//get current IPR
OutputBuffer = (PUCHAR)pIrp->AssociatedIrp.SystemBuffer;
OutputBufferLength = (ULONG)pIrpAndFilter->OutputBufferLength;
//使用资源
//结束前
pIrp->IoStatus.Status = Status;
pIrp->IoStatus.Information = bufSize;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
PsTerminateSystemThread(STATUS_SUCCESS);//end the thread
//是否释放资源
//NdisFreeMemory(pIrpAndFilter,sizeof(IrpAndFilter),0);
}
我测试过了,释放资源有问题,就如前面说的,两个指针都不能释放,这下就傻眼了,没有释放,程序倒是正常执行,释放反而错了。我知道那两个资源不能在这里释放,可是我Allocate一块空间了,难道就这样了...还是至少要释放ULONG那一块资源呢?不得而知!!望知道的指点一二。
网上有人回复说:
写道
用全局变量去保存那些指针不就得了,一个不够就用全局指针链表
我觉得倒是不错的主意
分享到:
相关推荐
疑问:关于内存释放 - **释放原则**:遵循“谁分配,谁释放”的原则。 - **释放技巧**:使用智能指针、RAII(Resource Acquisition Is Initialization)等技术简化内存管理。 #### 44. WDK+Visual Studio 2008...
- **释放内存**:关闭不必要的后台程序,减少内存占用。 - **内存测试**:使用内存诊断工具如Windows的Memory Diagnostics工具进行测试,确认内存是否存在问题。 - **更换硬件**:如果确定是硬件问题,考虑更换...
与栈不同,堆的内存释放需要程序员手动控制,如果忘记释放,就会导致内存泄漏。堆的大小在32位系统中可以达到4GB,但分配效率较低。 3. 自由存储区(Free Store):自由存储区与堆类似,通常由malloc等函数进行分配...
在看微博的时候, 有人提出了一个对于Vector内存泄露的疑问( Link)。 博主采用 Vector存储一些数据,但是发现在执行 clear() 之后内存并没有释放,于是怀疑产生了内存泄露。随后有人回复: “vector 的 ...
"C++ 创建二维动态数组与内存释放问题详解" C++ 创建二维动态数组是指在程序运行时动态地分配一个二维数组,以满足不同场景下的需求。然而,在使用二维动态数组时,内存释放问题也是需要特别注意的。 一、C++ 创建...
然而,在实际使用过程中,不少用户发现即使安装了4GB内存,系统识别的内存容量却远低于预期,这引发了许多疑问。本文将深入探讨这一现象背后的原因,并介绍如何最大化利用已安装的内存。 #### 二、4GB内存平台的...
- 内存泄漏:程序中分配的内存未被正确释放,久而久之可能导致系统资源耗尽。 - 资源泄漏:未正确关闭或释放如文件句柄、网络连接等资源。 - 空指针引用:试图访问已释放或未初始化的指针。 - 数组越界:访问...
这里就有疑问了,Android系统有自己的垃圾回收机制,可以不定期的回收掉不使用的内存空间,当然也包括Bitmap的空间。那为什么还需要这个方法呢? Bitmap类的构造方法都是私有的,所以开发者不能直接new出一个Bitmap...
本文将全面分析Android图片占用内存的情况,解答关于图片内存占用的疑惑。 首先,我们要理解Android系统中Bitmap对象的工作原理。Bitmap是Android用于存储图像数据的核心类,它代表了图像像素数据。当我们在应用中...
在深入探讨Linux系统的内存管理技巧之前,我们先来理解一下内存管理的基本概念。在Linux操作系统中,内存管理是至关重要的,它确保了系统的稳定性和效率。内存管理涉及到如何分配、回收和共享内存,以及如何处理内存...
本文将基于“C FAQ”(关于C语言的诸多疑问的权威解释)的内容,对其中涉及的关键知识点进行详细解析,帮助读者更好地理解和应用C语言。 #### 二、C FAQ概述 “C FAQ”是一份由Steve Summit编写的C语言常见问题...
在磁盘缓存中,软引用可以防止图片在内存不足时立即被清理,但又允许在必要时释放空间。 3. **网络缓存**:如果内存和磁盘缓存中都没有所需的图片,应用会尝试从网络上获取图片。网络缓存通常包括HTTP头部的Cache-...
5. **Valgrind发行文档**:关于Valgrind版本的信息。 6. **GNU许可文档**:Valgrind遵循的许可证条款。 #### 三、Valgrind快速入门指南概览 - **1. 引言**:简述Valgrind工具集的功能及核心工具Memcheck的作用。 - ...
Smartram通过其先进的算法,可以智能地判断哪些程序需要更多内存,哪些程序可以释放内存,以达到平衡各个应用程序的内存需求。此外,它还可以帮助用户识别内存泄漏问题,这对于开发者和普通用户来说都是极其有用的。...
- **内存管理**:C++中字符串的动态内存管理是关键,需要确保在分配和释放内存时避免内存泄漏。在自定义`String`类时,要特别关注构造、赋值、拷贝和析构过程中的内存处理。 - **异常安全**:在执行可能抛出异常的...
- 疑问解答:在教学过程中,及时解答学生关于指针使用的疑问,帮助他们克服对指针的恐惧和误解。 - 错误分析:通过分析常见的指针错误,如野指针、悬空指针、指针越界等,提高学生的错误诊断和调试能力。 - 指针与...
- **销毁**:当不再需要一个对象时,应释放其占用的内存。在易语言中,通常通过设置对象引用为零或者调用析构函数来触发对象的销毁。对象的引用计数减少到零时,系统会自动回收其内存。 4. 性能和内存管理 易语言的...
基于微信小程序的校园互助平台 ...个人中心:管理个人的资料信息、隐私设置、释放内存空间等,其中还有历史订单的查询,可以对有疑问的订单询问客服,请求介入。 任务:跑腿代购,物品租赁,二手商品出手,辅导功课