`
yexin218
  • 浏览: 973117 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

疑问:关于内存释放

阅读更多

今天碰到一个比较棘手的内存处理问题。

首先来看一个数据结构:

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那一块资源呢?不得而知!!望知道的指点一二。

 

网上有人回复说:

写道
用全局变量去保存那些指针不就得了,一个不够就用全局指针链表
 我觉得倒是不错的主意

2
4
分享到:
评论

相关推荐

    Filter驱动开发笔记

    疑问:关于内存释放 - **释放原则**:遵循“谁分配,谁释放”的原则。 - **释放技巧**:使用智能指针、RAII(Resource Acquisition Is Initialization)等技术简化内存管理。 #### 44. WDK+Visual Studio 2008...

    内存释放专家网吧优化版

    在使用“内存释放专家网吧优化版”时,用户可能会对软件的设置和功能产生疑问,这时候可以参考软件自带的“说明.txt”文档。该文档通常会提供详尽的安装指南、配置建议以及使用方法,帮助用户快速上手。在遇到问题时...

    解决内存不能read

    - **释放内存**:关闭不必要的后台程序,减少内存占用。 - **内存测试**:使用内存诊断工具如Windows的Memory Diagnostics工具进行测试,确认内存是否存在问题。 - **更换硬件**:如果确定是硬件问题,考虑更换...

    C++内存管理pdf版

    与栈不同,堆的内存释放需要程序员手动控制,如果忘记释放,就会导致内存泄漏。堆的大小在32位系统中可以达到4GB,但分配效率较低。 3. 自由存储区(Free Store):自由存储区与堆类似,通常由malloc等函数进行分配...

    正确释放Vector的内存

    在看微博的时候, 有人提出了一个对于Vector内存泄露的疑问( Link)。  博主采用 Vector存储一些数据,但是发现在执行 clear() 之后内存并没有释放,于是怀疑产生了内存泄露。随后有人回复:  “vector 的 ...

    c++创建二维动态数组与内存释放问题

    "C++ 创建二维动态数组与内存释放问题详解" C++ 创建二维动态数组是指在程序运行时动态地分配一个二维数组,以满足不同场景下的需求。然而,在使用二维动态数组时,内存释放问题也是需要特别注意的。 一、C++ 创建...

    4GB内存平台全探秘

    然而,在实际使用过程中,不少用户发现即使安装了4GB内存,系统识别的内存容量却远低于预期,这引发了许多疑问。本文将深入探讨这一现象背后的原因,并介绍如何最大化利用已安装的内存。 #### 二、4GB内存平台的...

    基于缺陷模式的软件测试PPT学习教案.pptx

    - 内存泄漏:程序中分配的内存未被正确释放,久而久之可能导致系统资源耗尽。 - 资源泄漏:未正确关闭或释放如文件句柄、网络连接等资源。 - 空指针引用:试图访问已释放或未初始化的指针。 - 数组越界:访问...

    解析Android开发优化之:对Bitmap的内存优化详解

    这里就有疑问了,Android系统有自己的垃圾回收机制,可以不定期的回收掉不使用的内存空间,当然也包括Bitmap的空间。那为什么还需要这个方法呢? Bitmap类的构造方法都是私有的,所以开发者不能直接new出一个Bitmap...

    Android图片占用内存全面分析

    本文将全面分析Android图片占用内存的情况,解答关于图片内存占用的疑惑。 首先,我们要理解Android系统中Bitmap对象的工作原理。Bitmap是Android用于存储图像数据的核心类,它代表了图像像素数据。当我们在应用中...

    Linux系统的内存管理技巧总结

    在深入探讨Linux系统的内存管理技巧之前,我们先来理解一下内存管理的基本概念。在Linux操作系统中,内存管理是至关重要的,它确保了系统的稳定性和效率。内存管理涉及到如何分配、回收和共享内存,以及如何处理内存...

    c faq (关于c语言的诸多疑问的权威解释,值得一读)

    本文将基于“C FAQ”(关于C语言的诸多疑问的权威解释)的内容,对其中涉及的关键知识点进行详细解析,帮助读者更好地理解和应用C语言。 #### 二、C FAQ概述 “C FAQ”是一份由Steve Summit编写的C语言常见问题...

    android安卓图片的三级缓存DEMO 三层缓存示例下载 强引用 软引用

    在磁盘缓存中,软引用可以防止图片在内存不足时立即被清理,但又允许在必要时释放空间。 3. **网络缓存**:如果内存和磁盘缓存中都没有所需的图片,应用会尝试从网络上获取图片。网络缓存通常包括HTTP头部的Cache-...

    valgrind manual

    5. **Valgrind发行文档**:关于Valgrind版本的信息。 6. **GNU许可文档**:Valgrind遵循的许可证条款。 #### 三、Valgrind快速入门指南概览 - **1. 引言**:简述Valgrind工具集的功能及核心工具Memcheck的作用。 - ...

    Portable_smartram.rar

    Smartram通过其先进的算法,可以智能地判断哪些程序需要更多内存,哪些程序可以释放内存,以达到平衡各个应用程序的内存需求。此外,它还可以帮助用户识别内存泄漏问题,这对于开发者和普通用户来说都是极其有用的。...

    C++下基于QT的String类自己实现

    - **内存管理**:C++中字符串的动态内存管理是关键,需要确保在分配和释放内存时避免内存泄漏。在自定义`String`类时,要特别关注构造、赋值、拷贝和析构过程中的内存处理。 - **异常安全**:在执行可能抛出异常的...

    C语言教学中“指针教学方法”探讨.pdf

    - 疑问解答:在教学过程中,及时解答学生关于指针使用的疑问,帮助他们克服对指针的恐惧和误解。 - 错误分析:通过分析常见的指针错误,如野指针、悬空指针、指针越界等,提高学生的错误诊断和调试能力。 - 指针与...

    易语言对象内存模型详解

    - **销毁**:当不再需要一个对象时,应释放其占用的内存。在易语言中,通常通过设置对象引用为零或者调用析构函数来触发对象的销毁。对象的引用计数减少到零时,系统会自动回收其内存。 4. 性能和内存管理 易语言的...

Global site tag (gtag.js) - Google Analytics