Ver Mensaje Individual
  #7 (permalink)  
Antiguo 14/03/2015, 00:07
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Respuesta inesperada en asignación de memoria

Pongo mi explicación en el código:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <new>
  3. #include <limits>
  4. #include <cstdint>
  5.  
  6. int main()
  7. {
  8.     long long n = std::numeric_limits<long long>::max();
  9.     long long *p;
  10.     int nCeros=0;
  11.  
  12.     do{
  13.         p= new (std::nothrow) long long[n];
  14.         if (p == nullptr){
  15.             nCeros++;
  16.             n = std::numeric_limits<long long>::max() / (10 * nCeros);
  17.         }
  18.     } while (p == nullptr);
  19.  
  20.     long long bytes = n * sizeof(long long);
  21.     std::cout << "\nDa la impresion de que se hubiera podido obtener memoria para "
  22.         << bytes << " Bytes;\n";
  23.     std::cout << "(Que serian " << bytes/1024.0/1024/1024 << " GB)\n\n";
  24.  
  25.     std::cout << "Incluso se puede tener la ilusion de que es posible\n"
  26.         "operar sobre ese espacio de memoria ...\n\n";
  27.  
  28.     std::cout << "Por ejemplo:\n";
  29.     p[0] = 5;
  30.     p[n-1] = 6;
  31.  
  32.     std::cout << "p[0] = " << p[0] << '\n';
  33.     std::cout << "p[" << n-1 << "] = " << p[n-1] << '\n';
  34.  
  35.     std::cout << "\nPero, realmente? Existe algo que se llame p[" << n-1 << "]?\n\n";
  36.  
  37.     std::cout << "size_t desilucion;\n";
  38.     size_t desilusion;
  39.  
  40.     std::cout << "El operator new usa el tipo size_t para el tamaño de los objetos.\n\n";
  41.  
  42.     std::cout << "En este caso, haciendo desilusion = n-1:\n";
  43.     desilusion = n-1;  // el compilador debería advertir que se trunca
  44.     std::cout << "la asignacion parece decir: desilusion = " << n-1 << ";\n\n"
  45.         "pero en realidad, al truncarse, lo que realmente queda es:\n";
  46.     std::cout << "desilusion == " << desilusion << "\n\n";
  47.  
  48.     std::cout << "De modo que:\n";
  49.     std::cout << "p[0] == " << p[0] << '\n';
  50.     std::cout << "p[" << desilusion << "] == " << p[desilusion] << "\n\n";
  51.  
  52.  
  53.     std::cout << "Como puede verse, el tamaño efectivamente asignado fue de:\n";
  54.     std::cout << desilusion * sizeof(long long) << " Bytes;\n";
  55.     std::cout << "que son " << desilusion * sizeof(long long)/ 1024.0/1024/1024
  56.         << " GB,\nque ya no es tan burrada, o es una burrada dentro de los limites esperados.\n\n";
  57.  
  58.  
  59.     std::cout << "P.D.: Aunque los arrays no son punteros... (es broma :),\n"
  60.         "siempre que se trate de direcciones de memoria, la medida\n"
  61.         "deberia expresarse en size_t\n";
  62.  
  63. }

Última edición por lareto; 14/03/2015 a las 00:41