Po zniszczeniu elementu map<char*,char*>
wszystkie elementy są w nim zawarte. Destruktor każdego elementu jest wywoływany, jeśli jest typu klasy.
Pamiętaj jednak, co dokładnie zawiera powyższa mapa. To nie jest łańcuch, jak można się spodziewać - to tylko wskaźniki do ciągów. Same struny nie są niszczone. Tylko wskaźniki. delete
nigdy nie jest wywoływany na wskaźnikach.
Sprawa w punkcie:
map<char*, char*> strings;
char* key = new char[10];
char* value = new char[256];
/* ... */
strings.insert(key,value);
W powyższym od delete
nigdy nie wezwała wskaźników utworzonych przez wywołań new
, ta pamięć będzie przeciekać kiedy strings
wykracza poza zakres.
To jest dobra ilustracja, dlaczego powinieneś unikać używania surowych wskaźników, new
i delete
. W twoim przypadku prawdopodobnie lepszym wyborem byłby wariant map<string,string>
.
EDIT:
Jak @sbi wspomniano w komentarzach, kolejny powód, dlaczego chcesz map<string,string>
nad map<char*,char*>
dlatego ze map<string,string>
Klucze są porównywane przez wartość, a nie-wskaźnik wartości.
Rozważmy:
#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";
}
Zasadniczo masz wkładając element z kluczem "foo", a następnie szukając tego elementu. Przetestuj powyższy kod, a przekonasz się, że go nie znaleziono. Jeśli jednak spróbować tego:
#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";
}
... masz zachowanie ty naprawdę chciał.
Zauważ, że 'mapa' indeksowana przez' char * 'prawdopodobnie nie zrobi tego, co chcesz. Dopasuje się do adresu ciągu, a nie do treści ciągu. –
W GCC 4.6 musisz zajrzeć do '/ usr/include/C++/4.6/bits/stl_map.h' , a na 4.6 zajrzyj do'/usr/include/C++/4.4/bits/stl_map.h' –