在堆上分配了一块,但是有好几个线程需要对该分配的内存进行操作(DELETE操作),我在一个线程里面怎样判断该内存块是否已经被其他的线程DELETE了呢??谢谢!

解决方案 »

  1.   

    在DELETE后,将其值赋为NULL,然后判断指针是不是为NULL就行了
      

  2.   

    删除的时候加临界变量排队,然后将指针置空,排队进来的线程检查NULL
      

  3.   

    用Debug函数验证下:
    _CrtIsValidHeapPointer原理:内存分配函数会在内存结尾加上FD FD FD FD 
    4个字节标志, 以作为free 或 delete标志. 如果在释放内存时找不到这4个字节, 一个原因是已被释放,另一个原因是非法写这结尾标志.好的habit是:wujiabao(JOB)说的, 释放后将指针置空 .
      

  4.   

    _CrtIsValidHeapPointer 不推荐使用,类似的函数还有IsBadXXXPtr等。这类函数会造成Structured Exception,很危险。另外结果也不可靠,如果被Free的内存被回收了或者另外用了结果不一定正确。这类讨论网上很多。uoyevoli 说的对,从设计角度上来讲,申请内存的人应该负责释放(这个规则适用于所有Resource)。几个Thread抢着释放内存设计上肯定有问题。
      

  5.   

    CRITICAL_SECTION cs; //互斥量UseMemoryBlock(){
    EnterCriticalSection (&cs) ;
    //使用内存 期间其他线程调用此函数 都将处于等待状态
    //释放内存
    LeaveCriticalSection (&cs) ;
    }
    这样比你的好吧
      

  6.   

    现在问题解决了,在内存释放的时候,并没有真正的释放内存;而是用了一张MAP表保存所有的内存指针,并保证所有的指针在表里面是唯一的;当某一个条件满足时,从MAP表里面移出该内存指针并释放该内存。但是我还没有验证该方法的效率问题。
      

  7.   

    用boost::shared_ptr,不需要考虑释放的问题。
      

  8.   

    现在问题解决了,在内存释放的时候,并没有真正的释放内存;而是用了一张MAP表保存所有的内存指针,并保证所有的指针在表里面是唯一的;当某一个条件满足时,从MAP表里面移出该内存指针并释放该内存。但是我还没有验证该方法的效率问题。这样确实可行好习惯: delete手置NULL
      

  9.   

    在DELETE后,将其值赋为NULL,然后判断指针是不是为NULL就行了
      

  10.   

    #define SAFE_DELETE(x) if(x){delete x; x= NULL;}