¿Por qué funciona eso?usando memoria sin asignar sin error?
#include <iostream>
using namespace std;
int main() {
float* tab[3];
int i = 0;
while(i < 3) {
tab[i] = new float[3-i];
i++;
}
cout << tab[2][7] << endl;
tab[2][7] = 6.87;
cout << tab[2][7] << endl;
i = 0;
while(i < 3)
delete[] tab[i];
}
mientras que este no?
#include <iostream>
using namespace std;
int main() {
float* tab = new float[3];
cout << tab[7] << endl;
tab[7] = 6.87;
cout << tab[7] << endl;
delete[] tab;
}
He intentado tanto programas en Windows XP con MS VS 2008, tanto compilado sin errores y el primero que corrió sin ningún error. El segundo hizo aparecer una ventana de error, sin embargo no puedo recordarlo y no puedo reproducir (no tengo acceso a Windows en este momento).
Los probé también en Linux (Kubuntu 10.10 con paquete kernel precompilado versión 2.6.35.23.25) con g ++ y ambos compilan y ejecutan sin ningún error.
¿Por qué? ¿No debería haber ventanas emergentes con algo así como "Acceso incorrecto a la memoria no asignada"?
Sé que debería (y, afortunadamente, lo hace) compilar sin errores, pero pensé que no debería funcionar sin ellos ... ¿Y por qué el segundo ejemplo comete errores en Windows y no en Linux?
Incluso entonces std :: vector limita las comprobaciones en compilaciones de depuración (afortunadamente!) –
A menos que use 'vector :: at()', o trabaje con iteradores en lugar de índices. – Eclipse
En realidad, este también es un error. En primer lugar, no existen las "páginas" en el estándar y no todas las implementaciones funcionarán de la manera en que usted afirma que lo hacen en ese sentido. En segundo lugar, solo puede sobrescribir la pila (en sistemas que incluso usan una) cuando la matriz se encuentra en ella. La memoria asignada desde la tienda gratuita no está en la pila. El tipo de ataque del que hablas ocurre cuando haces algo como 'void f() {char buf [SZ]; obtiene (buf); } ', que no es el problema del OP. –