阅读:2348回复:14
高分请教控制台程序的内存问题
我现在编了一个控制台程序需要频繁的分配和释放内存。老是在分配和释放的过程中出现问题。用VSA60带的源代码DBGHEAP.C跟进去发现,在分配时有LOCK HEAP的过程,但是在释放时却没有。
_nh_malloc_dbg()中有下面的代码: _mlock(_HEAP_LOCK); /* do the allocation */ pvBlk = _heap_alloc_dbg(nSize, nBlockUse, szFileName, nLine); /* unlock the heap */ _munlock(_HEAP_LOCK); 但是在_free_dbg()中却是 #ifdef _MT _CRTIMP void __cdecl _free_dbg( void * pUserData, int nBlockUse ) { /* lock the heap */ _mlock(_HEAP_LOCK); /* allocate the block */ _free_dbg_lk(pUserData, nBlockUse); /* unlock the heap */ _munlock(_HEAP_LOCK); } void __cdecl _free_dbg_lk( #else /* _MT */ _CRTIMP void __cdecl _free_dbg( #endif /* _MT */ void * pUserData, int nBlockUse ) { _CrtMemBlockHeader * pHead; /* verify heap before freeing */ if (_crtDbgFlag & _CRTDBG_CHECK_ALWAYS_DF) _ASSERTE(_CrtCheckMemory()); if (pUserData == NULL) return; //下面是函数体(略) } 由于_MT 没有,始终执行的是后面的代码。而且经常在后面的代码中出问题。 请问是什么原因,有什么办法执行前面的代码? |
|
沙发#
发布于:2005-05-12 16:31
老天,难不成你想在那些代码中找出错误?!
贴出你的代码就行了,会有人看出你错在哪里的。 |
|
|
板凳#
发布于:2005-05-12 16:43
错误都是在执行DBGHEAP.C的时候发现的,我的程序就到处都在调用MALLOC()和FREE()函数。我也仔细检查了好几遍,没发现越界访问的问题。我是在几个同的线程中调用的这两个函数。不知道这里面有没有访问全局变量的冲突。
|
|
地板#
发布于:2005-05-12 16:46
而且,我在分配和释放函数前后都加个锁好像就没问题了
|
|
地下室#
发布于:2005-05-12 16:47
那不就OK了。还有什么问题?
|
|
|
5楼#
发布于:2005-05-12 16:52
但是我调用次数很多呀,这样效率很低。而且系统的内存管理应该有很完善的保护才对呀。没那本书上说调用这两个函数还要这么处理呀。
|
|
6楼#
发布于:2005-05-12 17:03
你乱用内存就给你报错,这保护还不够完善的?
你开多个线程,就得用锁啊信号量啊事件啊这些东西,这是标准做法。 你实在觉得有问题,把你的代码贴出来吧。 对MALLOC()和FREE()的源代码,你要学习还行,要想从中挑错嘛,劝你赶快放弃这想法。 |
|
|
7楼#
发布于:2005-05-13 10:06
我不是要在这里挑错,我怀疑我的VC什么地方设置有问题
|
|
8楼#
发布于:2005-05-13 10:13
呵呵,一般不会,还是程序的错误,你若是方便的话,把代码贴出来或发给我。
|
|
|
9楼#
发布于:2005-05-13 10:19
我看发现它包含了一个MTDLL.h的头文件,_MT好像是支持多线程的条件编译宏。我不知道VC在哪里可以设置这个选项。有谁可以告诉我吗,谢谢!
|
|
10楼#
发布于:2005-05-13 10:31
Project-Settings-C/C++-Category-Code Generation-Use run-time library.
[编辑 - 5/13/05 by maqian] |
|
|
11楼#
发布于:2005-05-13 10:43
哦,谢谢。茅塞顿开呀,怎么给你分呀?
|
|
12楼#
发布于:2005-05-13 10:45
不客气,助人为快乐之本嘛。
|
|
|
13楼#
发布于:2005-05-13 10:48
顶楼有给分按纽,哈哈,有分进帐喽。
|
|
|
14楼#
发布于:2005-05-13 10:48
那就再次感谢了哦!!
|
|