new(),malloc()频繁调用后,用完就释放阿。

解决方案 »

  1.   

    LZ说的有道理,不过这个是vc6带的dll了,现在vc.net是否还这样?ms也不会更新vc6了,如果想继续用vc6,就只有避开这个问题更何况你说的问题恐怕只会在测试程序里可能出现,当lRequest等于-1时,内存已经分配完4gb了,现在支持超过4gb内存的系统,还会用这个老掉牙的dll吗?话说回来,lRequest是long类型本身,就没法超越4gb
      

  2.   

    上午做了个测试:
    int nCount =0;
    while(1)
    {
    char* p = new char[4]; 
    delete []p; 
    nCount++;
    if(nCount == 0xffffffff)
    {
    int q = 1;
    }
    }
    当nCount == 0xffffffff时掉进了_heap_alloc_dbg
    停在了
            if (lRequest == _crtBreakAlloc)
                _CrtDbgBreak();
    报错User breakpoint called from code at 0x10211920
    证实了这个BUG!问题是如何规避这个BUG呢?
      

  3.   

    我在2005下试试看
    不过,可以自己重载new运算符的啊
    operator new
      

  4.   

    看了LZ的测试代码(那得等多长时间啊),再去看看ms的源码,似乎是啊,找遍了debug版的代码,似乎_lRequestCurr只有增加,没有减少的地方,但是想不出解决的方法,板凳
      

  5.   

    DEBUG版本又不是让你发布的。
      

  6.   

    晕,不能因为是DEBUG版本就不管了吧,哪位大哥帮帮俺啊~~
      

  7.   

    曾经有人给出这样的解决方案,但是个人感觉应该也不行。大家可以分析一下看看。
      long lRequest;
      long NewCrtBreakAlloc;
      char* my_pointer =(char*) malloc(10);
      _CrtIsMemoryBlock(my_pointer, 10, &lRequest, NULL, NULL);
      free(my_pointer);
      if (lRequest > -1)
        NewCrtBreakAlloc = LONG_MIN / 2;
      else
        NewCrtBreakAlloc = LONG_MAX / 2;
      _CrtSetBreakAlloc(NewCrtBreakAlloc);