Me pregunto si el C o C++ estándar garantiza que el puntero no se cambia cuando realloc se llama con un (distinto de cero) de menor tamaño:¿puede mover el puntero de realloc si el nuevo tamaño es más pequeño?
size_t n=1000;
T*ptr=(T*)malloc(n*sizeof(T));
//<--do something useful (that won't touch/reallocate ptr of course)
size_t n2=100;//or any value in [1,n-1]
T*ptr2=(T*)realloc(ptr,n2*sizeof(T));
//<-- are we guaranteed that ptr2==ptr ?
Básicamente, puede el sistema operativo decidir sobre su propia que desde liberamos un gran bloque de memoria, quiere aprovechar todos los realocos para desfragmentar la memoria, y de alguna manera mover ptr2?
Anteriormente en esa página, dice "La función realloc() cambia el tamaño del objeto de memoria apuntado por ptr al tamaño especificado por tamaño. El contenido del objeto permanecerá sin cambios hasta el menor de los nuevos y tamaños antiguos. Si el nuevo tamaño del objeto de memoria requeriría movimiento del objeto, se libera el espacio para la instanciación previa del objeto ". No descarta el movimiento, pero es relativamente poco probable. –
Sí, aún tiene garantizado que todo lo que había en la memoria todavía estaría allí, gracias por señalar –