我的机子装的是winxp,4GB内存(windows显示3.13G),我用new来分配内存,当还有838M可用内存的时候,程序报错,说:
Unhandled exception at 0xxx in xx.exe: Microsoft C++ exception: std::bad_alloc @ 0x1198fc84, 这是什么回事?能不能有什么法子使用剩下的那些内存?
谢谢了

解决方案 »

  1.   

    在windows task manager里看到我的程序已经占用了1.7G的内存
      

  2.   

    to livedeal, 什么叫溢出了?
    我有一个for循环,大概循环几百次,每次分配一些内存,循环才运行一半的时候,还有快1G可用内存的时候,就弹出这种错误,这是怎么回事
      

  3.   

    应用程序只能使用地址空间中的下面两G,0x00000000-0x7fffffff
    上面的内存是操作系统的,0x80000000-0xffffffff
      

  4.   

    我的程序大概是这样的:main(){
    ...
    unsigned char** pBuffer = new unsigned char* [num];
    for(int i = 0; i < num; i ++) {
    pBuffer[i] = new unsigned char* [30M];
    ....
    // create a thread, pass the pBuffer[i] to that thread
    // pBuffer[i] is member of pSaveArg
    handle = (HANDLE)_beginthreadex(NULL, 0, thread_save, &pSaveArg[i],
    0, &threadID);
    if (handle == 0) printf("Failed to create the image save thread\n");
    ....
    }
    ...
    }thread_save()
    {
    ...
    //some operations
    ...
    delete [] pBuffer;
    }我的问题就是,main函数里的for循环进行一半就报错了,而thread_save()也运行完了几个,但是感觉内存好像还是没有被释放,这是怎么回事?
      

  5.   

    to david2083, 那程序要用更多的内存该怎么办呢?
      

  6.   

    delete [] pBuffer;
    这里错了应该
    delete[] (pBuffer[i]);
      

  7.   

    thread_save里的pBuffer就是main里面的pBuffer[i],  不好意思没有写清楚
      

  8.   

    对64bit的程序来说,一个int型也是64位,这样就感觉现在8G的内存跟原来32bitOS的4G内存差不多? 是这样吗?
      

  9.   

    64bit的OS用户程序能用多少内存呢?我的机子有64位的winxp,8GB内存。
      

  10.   

    程序应该没有问题的,如果我把循环的次数调少点,就能发现内存占用率先逐渐上升,然后随着save进程的执行而逐渐下降。但是for循环次数多时,分配内存的速度大于释放内存的速度,结果就导致程序不行了。这时候我是不是最好把程序转成64位的,会好很多?
      

  11.   

    我自己build的一个server,2个xeon quard-core, 8GB内存,我主要是用来控制一堆camera,若干个1024x768@30fps的彩色camera,若干个640x480@120fps的彩色camera,现在才各用了两个。
      

  12.   

    其实我的内存就是在线程里申请的,main调用grab(image)线程,然后grab线程申请大量的内存来缓冲得到的数据,然后grab调用save线程来存储并释放相应的内存。大家觉得我这个策略有没有什么问题?
      

  13.   

    两组camera有不同的配置,要创建不同的线程来控制,我也不想写多线程的程序,但是也没有办法
      

  14.   

    delete [] pBuffer;
    pBuffer = NULL;//这句不加上内存可能也无法使用,野指针
      

  15.   

    pBuffer = NULL; 其实这个我也有了,不好意思没有写清楚,谢谢
      

  16.   

    delete [] pBuffer;
    pBuffer = NULL;//这句不加上内存可能也无法被再次使用,成为野指针,造成内存泄露
      

  17.   

    pBuffer[i] = new unsigned char* [30M];//这句代码也有问题,能否把你的实际代码贴出来
      

  18.   

    thread_grab
    ....
    // allocate memory for thread_save input arguments
    saveArg* pSaveArg = new saveArg [loop + 5]; // thread
    HANDLE handle;
    unsigned threadID; // Grab a series of images from each camera
              for(int i = 0; i < loop; i ++) { // update thread parameters
                      // saveArgument里存有一些相同的参数,下面只用更新不同的参数就行了
    memcpy(&pSaveArg[i], &saveArgument, sizeof(saveArg));

    // allocate new memories
    pSaveArg[i].order = i;
    pSaveArg[i].pBuffer = new unsigned char [buffersize];
    index = 0;
                      
                      ..... // launch save image thread
    handle = (HANDLE)_beginthreadex(NULL, 0, thread_save, &pSaveArg[i],
    0, &threadID);
    if (handle == 0) printf("Failed to create the image save thread\n");
    } delete [] pSaveArg;}
    thread_save
    unsigned __stdcall thread_save(void* pArguments)
    {
    // get input variables
    saveArg sArg;
    memcpy(&sArg, pArguments, sizeof(saveArg));
    .....
    // release memory
    delete [] sArg.pBuffer;
             sArg.pBuffer = NULL;
    printf("memory release order %d\n", sArg.order); return 0;
    }这里我有一个问题,为了避免“野指针”这种情况,我是不是要
    首先:我在save 线程里创建了线程参数的备份,内存释放后,要把sArg.pBuffer = NULL;
    然后:我的save线程参数是grab线程new出来的,是不是那边的指针也要赋成NULL?谢谢了...
      

  19.   

    为什么要尽量少用线程呢?我的机子现在等于是8核的,应该处理这些线程还可以吧。而且创建比较多的save线程是因为我的内存在xp 32bit下不够用,只能用2G,所以我想创建线程来使用一些内存,用完了就释放给其他线程用。如果2G内存够我用的话,我就不用这么麻烦了?你有什么比较好的效率高的策略来解决这个问题吗?
      

  20.   

    delete [] pSaveArg;//这句话有问题
    pSaveArg应该一个一个释放,不可以一起释放
      

  21.   

    pSaveArg我是这样创建的,为什么要一个一个释放? 
    saveArg* pSaveArg = new saveArg [loop + 5];
    for循环里分配的内存是在save线程里释放的
      

  22.   

    一个new对应一个delete,然后再把指针置为NULL
      

  23.   

    memcpy(&pSaveArg[i], &saveArgument, sizeof(saveArg));

    // allocate new memories
    pSaveArg[i].order = i;
    pSaveArg[i].pBuffer = new unsigned char [buffersize];
    index = 0;
    从上面这几行代码看,在delete [] pSaveArg;pSaveArg = NULL;之前应该先delete [] pBuffer; pBuffer = NULL;
      

  24.   

    pSaveArg[i].pBuffer是在save线程里释放的
      

  25.   

    delete [] pSaveArg;
    这句要等所有线程都结束了才能执行在前面加等待语句或把这句删掉
      

  26.   

    如果删除了delete [] pSaveArg, 那这块内存不是没法释放了?
      

  27.   

    to WindAndSnow, 堆空间不够如何在多分配些呢?
      

  28.   

    to david2083, 写个WaitForMultipleThreads()应该不错,就应该能省去在save thread里copy输入参数那些操作。
      

  29.   

    听说new大于1M就会蓝屏未证实
      

  30.   

    这个都没有解决程序空间被2GB内存的限制,看来只能切换到64位的os下了。谢谢各位。