rainbowz608
驱动牛犊
驱动牛犊
  • 注册日期2002-08-08
  • 最后登录2005-08-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2348回复:14

高分请教控制台程序的内存问题

楼主#
更多 发布于:2005-05-12 16:02
我现在编了一个控制台程序需要频繁的分配和释放内存。老是在分配和释放的过程中出现问题。用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 没有,始终执行的是后面的代码。而且经常在后面的代码中出问题。
请问是什么原因,有什么办法执行前面的代码?
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-05-12 16:31
老天,难不成你想在那些代码中找出错误?!
贴出你的代码就行了,会有人看出你错在哪里的。
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
rainbowz608
驱动牛犊
驱动牛犊
  • 注册日期2002-08-08
  • 最后登录2005-08-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-05-12 16:43
错误都是在执行DBGHEAP.C的时候发现的,我的程序就到处都在调用MALLOC()和FREE()函数。我也仔细检查了好几遍,没发现越界访问的问题。我是在几个同的线程中调用的这两个函数。不知道这里面有没有访问全局变量的冲突。
rainbowz608
驱动牛犊
驱动牛犊
  • 注册日期2002-08-08
  • 最后登录2005-08-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-05-12 16:46
而且,我在分配和释放函数前后都加个锁好像就没问题了
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-05-12 16:47
那不就OK了。还有什么问题?
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
rainbowz608
驱动牛犊
驱动牛犊
  • 注册日期2002-08-08
  • 最后登录2005-08-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-05-12 16:52
但是我调用次数很多呀,这样效率很低。而且系统的内存管理应该有很完善的保护才对呀。没那本书上说调用这两个函数还要这么处理呀。
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-05-12 17:03
你乱用内存就给你报错,这保护还不够完善的?
你开多个线程,就得用锁啊信号量啊事件啊这些东西,这是标准做法。
你实在觉得有问题,把你的代码贴出来吧。
对MALLOC()和FREE()的源代码,你要学习还行,要想从中挑错嘛,劝你赶快放弃这想法。
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
rainbowz608
驱动牛犊
驱动牛犊
  • 注册日期2002-08-08
  • 最后登录2005-08-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-05-13 10:06
我不是要在这里挑错,我怀疑我的VC什么地方设置有问题
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-05-13 10:13
呵呵,一般不会,还是程序的错误,你若是方便的话,把代码贴出来或发给我。
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
rainbowz608
驱动牛犊
驱动牛犊
  • 注册日期2002-08-08
  • 最后登录2005-08-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-05-13 10:19
我看发现它包含了一个MTDLL.h的头文件,_MT好像是支持多线程的条件编译宏。我不知道VC在哪里可以设置这个选项。有谁可以告诉我吗,谢谢!
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-05-13 10:31
Project-Settings-C/C++-Category-Code Generation-Use run-time library.

[编辑 -  5/13/05 by  maqian]
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
rainbowz608
驱动牛犊
驱动牛犊
  • 注册日期2002-08-08
  • 最后登录2005-08-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-05-13 10:43
哦,谢谢。茅塞顿开呀,怎么给你分呀?
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-05-13 10:45
不客气,助人为快乐之本嘛。
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-05-13 10:48
顶楼有给分按纽,哈哈,有分进帐喽。
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
rainbowz608
驱动牛犊
驱动牛犊
  • 注册日期2002-08-08
  • 最后登录2005-08-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-05-13 10:48
那就再次感谢了哦!!
游客

返回顶部