Hola, estoy aprendiendo sobre el uso de tablas dinámicas en c++.
Estoy ejecutando el siguiente programa:
#include <iostream>
using namespace std;
int main() {
int **tabla;
int n=3;
int m=3;
int i;
// Array de punteros a int:
tabla = new int*[n];
// n arrays de m ints
for(i = 0; i < n; i++)
tabla[i] = new int[m];
tabla[2][20] = 1234;
cout << tabla[2][20] << endl;
// Liberar memoria:
for(i = 0; i < n; i++) delete[] tabla[i];
delete[] tabla;
cin.get();
return 0;
}
El programa funciona bien, no da error ni en compilación ni en ejecución. Sin embargo, como puede verse en el código, la matriz que defino es de 3x3 elementos y estoy accediendo a la posición [2][20] sin ningún problema.
¿Puede alguien aclararme esta contradicción? Si excedo el valor del primer índice, es decir, si intento acceder a la posición [20][2] sí que da error por fallo de segmentación.
Todo esto viene a colación de un programa bastante más complejo en el que, tras usar tablas dinámicas, obtengo el siguiente error de ejecución:
*** glibc detected *** ./CLEAN2: free(): invalid pointer: 0x0a08ad68 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7dbc454]
/lib/tls/i686/cmov/libc.so.6(cfree+0x96)[0xb7dbe4b6]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb7f990b1]
/usr/lib/libstdc++.so.6(_ZdaPv+0x1d)[0xb7f9910d]
./CLEAN2[0x804b687]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb7d63685]
./CLEAN2[0x804a951]
======= Memory map: ========
08048000-08090000 r-xp 00000000 08:07 1211084 /usr/local/CLEAN/CLEAN2
08090000-08091000 rw-p 00048000 08:07 1211084 /usr/local/CLEAN/CLEAN2
0a086000-0a0a7000 rw-p 0a086000 00:00 0 [heap]
b3800000-b3821000 rw-p b3800000 00:00 0
b3821000-b3900000 ---p b3821000 00:00 0
b393a000-b7d4d000 rw-p b393a000 00:00 0
b7d4d000-b7ea5000 r-xp 00000000 08:07 794449 /lib/tls/i686/cmov/libc-2.8.90.so
b7ea5000-b7ea7000 r--p 00158000 08:07 794449 /lib/tls/i686/cmov/libc-2.8.90.so
b7ea7000-b7ea8000 rw-p 0015a000 08:07 794449 /lib/tls/i686/cmov/libc-2.8.90.so
b7ea8000-b7eab000 rw-p b7ea8000 00:00 0
b7eab000-b7eb8000 r-xp 00000000 08:07 778447 /lib/libgcc_s.so.1
b7eb8000-b7eb9000 r--p 0000c000 08:07 778447 /lib/libgcc_s.so.1
b7eb9000-b7eba000 rw-p 0000d000 08:07 778447 /lib/libgcc_s.so.1
b7eba000-b7ede000 r-xp 00000000 08:07 794458 /lib/tls/i686/cmov/libm-2.8.90.so
b7ede000-b7edf000 r--p 00023000 08:07 794458 /lib/tls/i686/cmov/libm-2.8.90.so
b7edf000-b7ee0000 rw-p 00024000 08:07 794458 /lib/tls/i686/cmov/libm-2.8.90.so
b7ee0000-b7fc3000 r-xp 00000000 08:07 1030239 /usr/lib/libstdc++.so.6.0.10
b7fc3000-b7fc7000 r--p 000e3000 08:07 1030239 /usr/lib/libstdc++.so.6.0.10
b7fc7000-b7fc8000 rw-p 000e7000 08:07 1030239 /usr/lib/libstdc++.so.6.0.10
b7fc8000-b7fce000 rw-p b7fc8000 00:00 0
b7fdf000-b7fe0000 rw-p b7fdf000 00:00 0
b7fe0000-b7fea000 r-xp 00000000 08:07 286173 /usr/local/c++/lib/libutil.so
b7fea000-b7feb000 rw-p 00009000 08:07 286173 /usr/local/c++/lib/libutil.so
b7feb000-b800d000 r-xp 00000000 08:07 286289 /usr/local/c++/lib/libwav.so
b800d000-b800e000 rw-p 00022000 08:07 286289 /usr/local/c++/lib/libwav.so
b800e000-b800f000 rw-p b800e000 00:00 0
b800f000-b8016000 r-xp 00000000 08:07 286194 /usr/local/c++/lib/libxop_fft.so
b8016000-b8017000 rw-p 00007000 08:07 286194 /usr/local/c++/lib/libxop_fft.so
b8017000-b8078000 r-xp 00000000 08:07 286187 /usr/local/c++/lib/libimatge.so
b8078000-b807a000 rw-p 00061000 08:07 286187 /usr/local/c++/lib/libimatge.so
b807a000-b807c000 rw-p b807a000 00:00 0
b807c000-b8096000 r-xp 00000000 08:07 776739 /lib/ld-2.8.90.so
b8096000-b8097000 r-xp b8096000 00:00 0 [vdso]
b8097000-b8098000 r--p 0001a000 08:07 776739 /lib/ld-2.8.90.so
b8098000-b8099000 rw-p 0001b000 08:07 776739 /lib/ld-2.8.90.so
bf882000-bf898000 rw-p bffea000 00:00 0 [stack]
Bandera 2Cancelado
Muchas gracias!!