Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: SARGE553413 en 5 Septiembre 2014, 18:50 PM

Título: new lanza bad_alloc y no sé por qué
Publicado por: SARGE553413 en 5 Septiembre 2014, 18:50 PM
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.
Título: Re: new lanza bad_alloc y no sé por qué
Publicado por: Eternal Idol en 5 Septiembre 2014, 19:11 PM
Comproba la memoria de tu proceso, tal vez tengas un memory leak.
Título: Re: new lanza bad_alloc y no sé por qué
Publicado por: SARGE553413 en 5 Septiembre 2014, 20:27 PM
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.
Título: Re: new lanza bad_alloc y no sé por qué
Publicado por: 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?
Título: Re: new lanza bad_alloc y no sé por qué
Publicado por: Eternal Idol en 5 Septiembre 2014, 21:49 PM
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).
Título: Re: new lanza bad_alloc y no sé por qué
Publicado por: SARGE553413 en 6 Septiembre 2014, 14:13 PM
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?
Título: Re: new lanza bad_alloc y no sé por qué
Publicado por: ivancea96 en 6 Septiembre 2014, 14:36 PM
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.