osea lo que hacia con malloc si se que era una asignacion global, osea el tamanio total de la matriz. pero pense que con esa forma de new (la que no compila) era tambien asignacion global PARA una matriz.
pero ahora segun observo
items_de_descripcion = (char**) new char[cantidad_items * capacidad + cantidad_items * sizeof(char*)];
esto asignaria el tamaño total de la matriz pero de forma contigua, es esto asi ?
Eso asigna tamaño para los puteros y la matriz en memoria contigua.
y explicame otra cosa, esto
.... Al asignar primero espacio para los punteros a las cadenas, la memoria no va a ser contínua y debes asignar espacio, despues, para cada cadena.
.....
entiendo que inclusive el compilador no acepta de otra forma, pero porque esa necesidad de hacerlo asi, osea primero los 5 punteros y despues los vectores de cada uno
si puedes contestarme esas dos preguntas te lo agradeceria me has ayudado a entender, gracias
El uso de new tal como se muestra mas arriba es equivalente a el uso de cualquier función que localice memoria. Una vez obtenido el bloque de memoria necesario, somos nosotros los que vamos a decidir donde estarán los punteros a las cadenas y donde estarán éstas. Como es mas fácil definir que tenemos todos los punteros al principio, así lo propongo. De ese modo al referirnos a un puntero que apunte al principio del bloque, su contenido será el primer puntero... Por similitud al significado de un array en C ( un array se define por un puntero al primer elemento del mismo). Pero en esto no tiene nada que ver el compilador, aunque si la convención de C/C++. Tu puedes hacerlo de otra forma, incluso sin pos punteros a las cadenas, pues si todas ellas tienen el mismo tamaño, las puedes localizar sin necesidad de una tabla o array de punteros previo.
En esto del manejo de la memoria y punteros el C/C++ es un campeón
No se si me explico o te lío mas.
Saludos.