阅读:1532回复:8
用驱动里的new 和delete来分配和释放内存
DS写的NT式的ISA驱动里,应用层用DEVICEIOCTL传递事件对象给驱动,在相应驱动的分发例程里,驱动用到new来给事件分配非分页内存,应用循环发事件对象给驱动,所以驱动里反复用new了很多次来分配非分页内存,我理解应当在下一次事件对象到来前,用delete来释放前面分配的内存。我这样去做了没什么问题。我在驱动的卸载例程里为安全着想,又判断了以前又new分配的内存是否是空,如果不是空,就调用delete来释放。程序运行到这里的时候出现了如下的错误:
BAD_POOL_CALLER 显然是前面已经用delete释放了内存,后面又要释放,但我认为,在卸载例程里,我没有直接调用delete,而是先判断的指针是否是空,应当没什么问题的。 |
|
|
沙发#
发布于:2003-09-15 15:12
你前面delete后,是不是没有让pointer等于NULL?
|
|
板凳#
发布于:2003-09-15 17:14
是的,我前面用delete 的之前,先判断指针是否是空的,如果不是空的就 执行delete来释放内存,然后就没把指针指向空。
我回去试试,看指向空,是否出错! |
|
|
地板#
发布于:2003-09-15 17:55
刚才试了,真是老兄说的那样,没有把指针指向空的,问题解决了。我还是有个问题,是在驱动初始化的时候分配好内存,以后每次分发例程执行的时候不再分配和释放好呢,还是每次在分发例程里分配和释放??
|
|
|
地下室#
发布于:2003-09-15 22:44
如果每次大小一样,可以考虑用lookaside list
|
|
5楼#
发布于:2003-09-16 08:14
如果每次大小一样,可以考虑用lookaside list 谢谢大虾的知道,我想知道在DS里有没有这样的函数来实现同样的功能。 |
|
|
6楼#
发布于:2003-09-16 15:08
只有说sorry了
|
|
7楼#
发布于:2003-09-16 16:14
我查到了,有一个类函数专门用来做这个和DDK里你说的那个能实现同样的功能:KHeap
|
|
|
8楼#
发布于:2003-09-18 12:19
如果每次大小一样,可以考虑用lookaside list oh,看看 |
|
|