Estás mezclando C y C++. Recuerda que
son lenguajes diferentes.
Lo siguiente:
Código:
//Obtengo memoria para los elementos necesarios
rutas = new(nothrow) AnsiString*[nSeleccionadas];
Sí, estás obteniendo "memoria para los elementos necesarios", pero estás creando
nSeleccionadas referencias a objetos de clase AnsiString, que se almacenan en una lista (
array) referenciada por el puntero
rutas. Ojo, porque
no estás creando ningún objeto.
Por eso lo siguiente:
Código:
//Limpio todo lo necesario
memset(rutas, 0, sizeof(rutas));
no limpia nada. Lo que hace es asignar el valor 0 a los primeras 8 octetos (asumiendo 64bit) de la lista referenciada por
rutas, independientemente del tamaño de la misma.
memset no sabe de objetos, sólo sabe de posiciones de memoria. Y
sizeof devuelve el tamaño del tipo, no el número de elementos de una lista (salvo que lo hayan cambiado en la definición del lenguaje C++ 99 o posterior, que si es así me parece una cagada monumental...). Estas dos funciones son funciones C, no C++.
Para limpiar los objetos has de usar un bucle y limpiar cada objeto, uno a uno, de la forma apropiada, similar a tu código de liberación de memoria:
Código:
int Ndx;
for (Ndx = 0; Ndx < nSeleccionadas; Ndx++)
*(rutas[Ndx]) = ""; // La clase AnsiString sobrecarga el operador "=".
Nota: Hace años que no programo C++, y de hecho me mosquea lo de "
new(nothrow)", pero creo que no he cometido ningún error. Aun así, si alguien lo tiene más fresco, que lo diga.