new lanza bad_alloc y no sé por qué

Iniciado por SARGE553413, 5 Septiembre 2014, 18:50 PM

0 Miembros y 1 Visitante están viendo este tema.

SARGE553413

Hola a todos.

Tengo un problema con un programa de C++. En un momento dado intento reservar memoria mediante el operador 'new', pero este lanza 'bad_alloc' y no entiendo por qué, ya que la cantidad de memoria que quiero reservar es relativamente baja para lo que tiene mi PC (3 GB).
Adjunto código, errores etc:

Cantidad de bytes (unsigned char) que intento reservar: 455282688 - 455,282,688 bytes

Datos extraídos del admin. de tareas durante el error:
Memoria física (KB)
Total: 3145068
Disponible: 1300596 - 1301394
Caché sistema: 1100432 (+ o -)

Mensaje de error por pantalla (con std::exception::what)
bad allocation

Código (indico el error):

...
typedef unsigned char uchar;
...

uchar* FrameLinkCamThread::getAttachedCapturedFrames(ulong &_totalSize){
ulong tSize=0;
for(uint i=0;i<this->numFramesCaptured;i++) tSize+=this->framesLegths[i];
uchar *res=NULL;
try{
res=new uchar[tSize];  //<==== Aquí esta el error
}catch(bad_alloc &e){
cout<<e.waht()<<endl;
char buff[256];
cin.getline(buff,256);
}
uint k=0;
for(uint i=0;i<this->numFramesCaptured;i++){
memcpy(&res[k],this->frames[i],this->framesLegths[i]);
k+=this->framesLegths[i];

}
_totalSize=tSize;
return res;
}


Nota: He intentado reservar en el main un vector igual que 'res' (que es el que da el error) y lo reserva sin problemas.

No entiendo cuál es el problema, ¿alguien puede ayudarme por favor?

Gracias, saludos.

Eternal Idol

Comproba la memoria de tu proceso, tal vez tengas un memory leak.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

SARGE553413

Hola de nuevo, gracias por la respuesta.

En su día ya "depuré" las fugas de memoria (tenía una y gorda). Lo hice solo con el admin. de tareas, viendo lo que se llenaba la memoria. Imagino que habrá herramientas para depurar este tipo de cosas, acepto sugerencias.

De todas formas no creo que sea una memory leak, ¿puede ser que mi SO (win xp) limite la cantidad de memoria que puede reservar un proceso?

Gracias, saludos.

ivancea96

455.282.688 bytes == 455.282 kilobytes == 455 megabytes

Dado que es bastante, ¿es posible que no encuentre medio GigaByte de memoria libre consecutiva?

Eternal Idol

Cita de: SARGE553413 en  5 Septiembre 2014, 20:27 PMDe todas formas no creo que sea una memory leak, ¿puede ser que mi SO (win xp) limite la cantidad de memoria que puede reservar un proceso?

Siendo XP asumo que es de 32 bits, en ese caso normalmente tu programa tiene un espacio de direcciones de 2 GB (el cual ya esta ocupado en parte por tu programa, las DLLs que hayan cargadas y la memoria dinamica).
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

SARGE553413

Cita de: ivancea96 en  5 Septiembre 2014, 20:40 PM
455.282.688 bytes == 455.282 kilobytes == 455 megabytes

Dado que es bastante, ¿es posible que no encuentre medio GigaByte de memoria libre consecutiva?

Eso mismo pensé yo, pero imagino que el SO se encargará de solucionar esas cosas, ¿me equivoco?

ivancea96

La memoria que reservan los programas, reservada está, eso no lo cambia porque un programa quiera user mucha memoria.
En lugar de hacer tal asignación de memoria, trata de partir en pequeños "new", por ejemplo.