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

Cita:
Ciertamente en mi caso el truncado es brutal ya que n-1 es 922337203685477579 y desilusion vale 3435973835. ¿donde están los 922337203685477579 miembros?
No están en ningún lado, nunca existieron. El programa está intentando asignar una cantidad de memoria imposible e ir bajando las pretensiones hasta que lo consiga, y para eso usa la expresión:
Código C++:
Ver original
  1. p= new (std::nothrow) long long[n];
Pero, como en tu plataforma un long long es de 64 bits, mientras que un size_t es de 32, lo que realmente está sucediendo es:
Código C++:
Ver original
  1. p= new (std::nothrow) long long[(size_t)n];
Y esa asignación tiene éxito cuando es posible asignar n * sizeof(long long) truncados al hacer el cast a size_t.
Recuerda que la cantidad de memoria que puede asignar tu programa depende varios factores (¿leíste el artículo que mencionaba en mi primer mensaje, verdad?), y que para un Windows de 32 bits es razonable esperar algo así como 1,7 GB (que van a salir de la ram; y si no alcanza, del archivo de intercambio).
Cita:
... ¿que pasa si realmente quiero ver el valor de p[n-1] donde n sea 3435973836?
Si has asignado una cantidad de bytes a p, ese es el límite de tu variable, más allá hay cualquier cosa, otros datos o código del programa, lo que sea que haya en la memoria después de p. Pero si el programa ya agotó todo su espacio permitido por el sistema operativo, 3435973836 queda fuera de su universo, que en CPUs en modo protegido (https://en.wikipedia.org/wiki/Protected_mode) significa la muerte del programa.

Cita:
El caso es que al ser desilusion de 4 bytes y n de 8 bytes ¿cuantas veces se ha truncado desilusion?
Puedes hacer la cuenta; tienes a
std::numeric_limits<size_t>::max() y a
std::numeric_limits<long long>::max() y que
std::numeric_limits<size_t>::max() +1 == 0

Cita:
PD: al hacer p[n-1]... el compilador me da warnings de Suspicious pointer conversion.
Parece razonable. En términos de aritmética de punteros, p[n-1] es p + n-1, donde n se definió como long long, pero se usa truncado a size_t.

Última edición por lareto; 14/03/2015 a las 06:15