Ver Mensaje Individual
  #4 (permalink)  
Antiguo 13/03/2015, 17:30
aguml
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Respuesta inesperada en asignación de memoria

Pues yo vi un inconveniente muy gordo, usa fuerza bruta y empieza desde 1 y el tamaño maximo de un long long int es inmenso y podria ser eterno dependiendo de la memoria disponible. Para hacer unas pruebas y aligerar lo maximo el proceso hice esto:
Código PHP:
#include <iostream>
#include <new>
#include <math>
using namespace std;
     
int main ()
{
   
unsigned long long int n std::numeric_limits<long long int>::max();
   
long long int *p;
   
unsigned long long int tamEnBytes;
   
double tamEnKbtamEnMbtamEnGb;
   
int nCeros=0;

   
// Voy incrementando exponencialmente 10^nDigitos para avanzar mas rapido
   // hasta un valor que de null al reservar
   
do{
      
p= new (std::nothrowlong long int[n];
      if(
== NULL){
         
nCeros++;
         
std::numeric_limits<long long int>::max() / (10*nCeros);
      }
   }while(
&& == NULL);

   
//Una vez salga libero la memoria
   
if(!= NULL)
   {
      
delete[] p;

      
// Una vez salga del bucle anterior tendré un valor mayor al que puedo usar
      // asi que lo voy decrementando hasta encontrar el valor valido maximo
      
do{
         
n++;
         
p= new (std::nothrowlong long int[n];
         if(
!= NULL)
            
delete [] p;
      }while(
!= NULL && std::numeric_limits<long long int>::max());

      
n--;
      
tamEnBytes sizeof(long long int) * n;
      
tamEnKb tamEnBytes / (double)1024 n;
      
tamEnMb tamEnKb 1024;
      
tamEnGb tamEnMb 1024;
      
cout << endl << "-----------------------" << endl;
      
cout << "Numero maximo de elementos para los que se pudo obtener memoria es: " << << endl;
      
cout << "Memoria total consumida por el array: " << endl <<
      
tamEnBytes << " bytes o " << endl <<
      
tamEnKb << " kb o " << endl <<
      
tamEnMb << " Mb o " << endl <<
      
tamEnGb << " Gb" << endl << endl;
   }
   
cout << "Presiona una tecla para salir" << endl;
   
cin.get();
   return 
0;

y me da este resultado:
Cita:
-----------------------
Numero maximo de elementos para los que se pudo obtener memoria es: 922337203716897579
Memoria total consumida por el array:
7378697629735180632 bytes o
6.64614e+33 kb o
6.49037e+30 Mb o
6.33825e+27 Gb

Presiona una tecla para salir
Muchos Gigas ¿no? ¿que hago mal para que me de esas burradas? solo tengo 1 giga de ram ¿de donde se saca tanto? Eso no lo tengo ni con el disco duro jajaja.
A ver si veis el fallo aunque pienso que pude ser algo relacionado con desbordamientos de variables o cosas asi pero no lo se seguro ni como solucionarlo.