一个算法,程序运行大概占用50M左右的内存,按理说占用不大,系统还有250M
内存可用。运行10分钟后,
这条语句出现错误
ary = realloc (ary, newlen*elsz);
   if (ary == NULL && newlen != 0){
      cout << "NEWLEN = " << newlen*elsz << endl;
      perror("REALLOC");
      exit(-1);   }
   return newlen;
出现null,也就是无法分配内存,此时newlen*elsz=268000
应该还有内存可以分配的
后来改成,采用malloc再次分配,还是返回null
ary = (Items *)::realloc (ary, newlen*elsz);
   if (ary == NULL && newlen != 0){
      cout << "NEWLEN = " << newlen*elsz << endl;
          void * temp = malloc(newlen*elsz);
          if(temp==NULL)
          {
                perror("REALLOC");
                exit(-1);
          }
          memcpy(temp,ary,newlen*elsz);
          free(ary);
          ary=(Items *)temp;   }
   return newlen;谁能说一下怎么回事。

解决方案 »

  1.   

    刚才测试了一下
    如果申请不成功,则分别申请1000份可以成功。是否可以说明是内存碎片。
    如果不自己开堆,又没有办法用heapcompact来让系统的堆整理一下
      

  2.   

    大的申请不成功,分别申请1000份小的成功,确实是内存碎片.
    我以前的开发经验是,平凡的内存操作,特别是要开辟很大的内存空间,我会采取 内存映射 或者是自己开堆,heapcompact这个函数我没用过,帮不上忙.
      

  3.   

    内存碎片是这么回事,比如说现在有1M的剩余空间,但是由两个0.5M的空间组成,你需要开辟0.6M的空间,失败.但开辟6个0.1M的空间,成功.