Cuando se destruye map<char*,char*>
, también lo están todos los elementos que contiene. Se llama al destructor de cada elemento, si es de tipo de clase.
Sin embargo, tenga en cuenta exactamente lo que figura en su mapa de arriba. No son cadenas, como es de esperar, solo son indicadores de cadenas. Las cuerdas en sí no son destruidas. Solo los punteros son delete
nunca se llama en los punteros.
Caso en cuestión:
map<char*, char*> strings;
char* key = new char[10];
char* value = new char[256];
/* ... */
strings.insert(key,value);
En lo anterior, ya que delete
Nunca se pidió a los punteros creados por las llamadas a new
, esta memoria se fuga cuando strings
sale del ámbito.
Esta es una buena ilustración de por qué debe evitar el uso de punteros sin procesar, new
y delete
. En su caso, map<string,string>
probablemente sea una mejor opción.
EDIT:
Como @sbi mencionado en los comentarios, otra razón por la que usted quiere map<string,string>
sobre map<char*,char*>
es porque con map<string,string>
claves se comparan por valor, en lugar de un triple-valor.
considerar:
#include <map>
#include <iostream>
#include <string>
using namespace std;
int main()
{
static const char MyKey[] = "foo";
const char bar[] = "bar";
typedef map<const char*,const char*> Strings;
Strings strings;
strings.insert(make_pair(MyKey,bar));
string ss = "foo";
Strings::const_iterator it = strings.find(ss.c_str());
if(it == strings.end())
cout << "Not Found!";
else
cout << "Found";
}
Fundamentalmente, vas a insertar un elemento con la clave "foo" y luego la búsqueda de ese elemento. Pruebe el código anterior y verá que no se encuentra. Sin embargo, si usted intenta esto:
#include <map>
#include <iostream>
#include <string>
using namespace std;
int main()
{
typedef map<string,string> Strings;
Strings strings;
strings.insert(make_pair("foo","bar"));
string ss = "foo";
Strings::iterator it = strings.find(ss);
if(it == strings.end())
cout << "Not Found~!";
else
cout << "Found";
}
... se obtiene el comportamiento que realmente querido.
Tenga en cuenta que un 'mapa' indexado por' char * 'probablemente no hará lo que quiera. Coincidirá en la dirección de la cadena, no en el contenido de la cadena. –
En GCC 4.6 tiene que mirar adentro '/ usr/include/C++/4.6/bits/stl_map.h' y en 4.6 mirar adentro'/usr/include/C++/4.4/bits/stl_map.h' –