碰到线程内存申请奇怪问题。

emshow 2003-10-17 07:32:41
近日,由于需要,封装了一个多线程TCP读写库。
其中,我需要在DLL的函数中,申请内容缓冲区。
(创建了一个非MFC的DLL。环境,WIN2000P, VC6.0+sp5)
在DLL中,我使用malloc申请内存能够成功,但是free时
出现0xC00005的异常(使用VC调式时候会出现在LOG窗口中,用try也捕捉不了异常)
用内存察看器发现free总是会多释放一些内存,如果我跟踪进free(因此VC会采用调适版的free)发现它判断我的buffer总是会大些。例如,我申请12bytes,它会释放我32bytes.我以为是字节对齐问题。所以
加上了
#pragma pack( push, 1 )//在数据定义时,也加上了这个
但是问题还是如此
但是如果我申请一个10000bytes的缓冲区,它就不会有问题。
(请不要提醒我,使用GlobalAlloc或LocalAlloc来申请buffer,因为程序需要移植)


...全文
46 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
larryvc 2003-10-21
  • 打赏
  • 举报
回复
将char *pp = ( char * )malloc( 12 )改为char *pp = (char *)malloc(12*sizeof(char))
emshow 2003-10-21
  • 打赏
  • 举报
回复
就是在一个线程里申请内存,然后马上释放,就会有问题啊。
char *pp = ( char * )malloc( 12 )
free( pp ); //出错!,C00005错误,内存访问异常


emshow 2003-10-21
  • 打赏
  • 举报
回复
堆(heap)的问题?
我修改了程序的C++运行时库为多线程的出现
Invalid Address specified to RtlValidateHeap( 360000, 364e10 )
??
好晕啊。!
emshow 2003-10-21
  • 打赏
  • 举报
回复
发现是VC的crt库的问题。
可能我引用的是LIBCD.LIB
而多线程程序需要MSVCRTD.LIB
//参看MSDN,发现
Run-Time Library Reference

C Run-Time Libraries

正在试验中,
不过上面我写的东东在Linux下跑是没有任何问题的。
aihaiff 2003-10-20
  • 打赏
  • 举报
回复
我需要编一个程序:我用ccd采集了好多的离散的点,我要把这些点都拟和到一个函数之中,这个函数是多项式形式的,经过计算选择,我找到了一个36个正交基底的多项式,我现在需要算出每个基底的系数。如果可以最好不要用vc编,但是只是给我算法就已经很好了

  • 打赏
  • 举报
回复
给出分配内存和释放内存的代码,看看先
emshow 2003-10-20
  • 打赏
  • 举报
回复
1),它在一个DLL中,被释放。
2)关于申请内存时,申请12字节,返回的是32字节的问题(是释放32字节)
问题,我释放时会产生异常。
是否是DLL中对线程申请数据有限制?
对齐宏是有效的
emshow 2003-10-19
  • 打赏
  • 举报
回复
看看有没有数组越界
或者其他内存操作的代码是不是有问题
//无,就一个简单的申请内存的操作,然后接着就释放。

MilitaryMiniatures 2003-10-19
  • 打赏
  • 举报
回复
几个问题:
1,你的内存申请和释放是在同一个模块里面么?就是说,是否在同一个dll里面,或者同一个exe里面,或者是在dll里面申请,在exe里面释放?
如果是在dll里面申请,而在exe里面释放,那么,问题就可能产生。这种情况下,建议修改程序,使得内存的申请在同一个模块里面进行。
2,关于申请内存时,申请12字节,返回的是32字节的问题,这个很简单,因为,这个是Win 32的内存管理机制,你不必去理会,你即使加上了#pragma那一行语句,实际上,这是两个概念:#pragma是C/C++中的语句,它使得结构中变量的对齐在字节或者设定的单位边缘,而具体分配大小时,是Win32的事情,Win32在管理内存时,必然存在一个最小的内存分配单位,不可能说,你要5个字节就分配5个字节,肯定要大一些,这样管理内存才方便,而且这样的访问速度比较高。
tbmac 2003-10-17
  • 打赏
  • 举报
回复
看看有没有数组越界
或者其他内存操作的代码是不是有问题

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧