怎么判断该内存块已经被DELETE了??? 在堆上分配了一块,但是有好几个线程需要对该分配的内存进行操作(DELETE操作),我在一个线程里面怎样判断该内存块是否已经被其他的线程DELETE了呢??谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在DELETE后,将其值赋为NULL,然后判断指针是不是为NULL就行了 删除的时候加临界变量排队,然后将指针置空,排队进来的线程检查NULL 用Debug函数验证下:_CrtIsValidHeapPointer原理:内存分配函数会在内存结尾加上FD FD FD FD 4个字节标志, 以作为free 或 delete标志. 如果在释放内存时找不到这4个字节, 一个原因是已被释放,另一个原因是非法写这结尾标志.好的habit是:wujiabao(JOB)说的, 释放后将指针置空 . _CrtIsValidHeapPointer 不推荐使用,类似的函数还有IsBadXXXPtr等。这类函数会造成Structured Exception,很危险。另外结果也不可靠,如果被Free的内存被回收了或者另外用了结果不一定正确。这类讨论网上很多。uoyevoli 说的对,从设计角度上来讲,申请内存的人应该负责释放(这个规则适用于所有Resource)。几个Thread抢着释放内存设计上肯定有问题。 CRITICAL_SECTION cs; //互斥量UseMemoryBlock(){ EnterCriticalSection (&cs) ; //使用内存 期间其他线程调用此函数 都将处于等待状态 //释放内存 LeaveCriticalSection (&cs) ;}这样比你的好吧 现在问题解决了,在内存释放的时候,并没有真正的释放内存;而是用了一张MAP表保存所有的内存指针,并保证所有的指针在表里面是唯一的;当某一个条件满足时,从MAP表里面移出该内存指针并释放该内存。但是我还没有验证该方法的效率问题。 用boost::shared_ptr,不需要考虑释放的问题。 现在问题解决了,在内存释放的时候,并没有真正的释放内存;而是用了一张MAP表保存所有的内存指针,并保证所有的指针在表里面是唯一的;当某一个条件满足时,从MAP表里面移出该内存指针并释放该内存。但是我还没有验证该方法的效率问题。这样确实可行好习惯: delete手置NULL 在DELETE后,将其值赋为NULL,然后判断指针是不是为NULL就行了 #define SAFE_DELETE(x) if(x){delete x; x= NULL;} 动态链接库的注册 怎么写不规则按钮阿 这个界面怎么做呢? 如何在一个程序里调用另一个程序,并将被调用程序的输出写到一个文本 关于UpdateData函数的问题 一个简单的聊天室,VC,MFC, 我用vc++.net写了个dll 文件 请问怎么给别人注册 各位大虾!怎样解决读取unicode文本中的乱码问题阿! 请教如何获取一个进程的启动命令行参数. 关于枚局局域网资源问题! DoModal()时出现的问题! CTreeCtrl结点单击问题
_CrtIsValidHeapPointer原理:内存分配函数会在内存结尾加上FD FD FD FD
4个字节标志, 以作为free 或 delete标志. 如果在释放内存时找不到这4个字节, 一个原因是已被释放,另一个原因是非法写这结尾标志.好的habit是:wujiabao(JOB)说的, 释放后将指针置空 .
EnterCriticalSection (&cs) ;
//使用内存 期间其他线程调用此函数 都将处于等待状态
//释放内存
LeaveCriticalSection (&cs) ;
}
这样比你的好吧