我的机子装的是winxp,4GB内存(windows显示3.13G),我用new来分配内存,当还有838M可用内存的时候,程序报错,说:
Unhandled exception at 0xxx in xx.exe: Microsoft C++ exception: std::bad_alloc @ 0x1198fc84, 这是什么回事?能不能有什么法子使用剩下的那些内存?
谢谢了
Unhandled exception at 0xxx in xx.exe: Microsoft C++ exception: std::bad_alloc @ 0x1198fc84, 这是什么回事?能不能有什么法子使用剩下的那些内存?
谢谢了
我有一个for循环,大概循环几百次,每次分配一些内存,循环才运行一半的时候,还有快1G可用内存的时候,就弹出这种错误,这是怎么回事
上面的内存是操作系统的,0x80000000-0xffffffff
...
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()也运行完了几个,但是感觉内存好像还是没有被释放,这是怎么回事?
这里错了应该
delete[] (pBuffer[i]);
pBuffer = NULL;//这句不加上内存可能也无法使用,野指针
pBuffer = NULL;//这句不加上内存可能也无法被再次使用,成为野指针,造成内存泄露
....
// 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?谢谢了...
pSaveArg应该一个一个释放,不可以一起释放
saveArg* pSaveArg = new saveArg [loop + 5];
for循环里分配的内存是在save线程里释放的
// allocate new memories
pSaveArg[i].order = i;
pSaveArg[i].pBuffer = new unsigned char [buffersize];
index = 0;
从上面这几行代码看,在delete [] pSaveArg;pSaveArg = NULL;之前应该先delete [] pBuffer; pBuffer = NULL;
这句要等所有线程都结束了才能执行在前面加等待语句或把这句删掉