Когда уничтожено map<char*,char*>
, то же самое относится и ко всем элементам, которые в нем содержатся. Деструктор каждого элемента вызывается, если он имеет тип класса.
Однако имейте в виду, что именно содержится в вашей карте выше. Это не строки, как вы могли бы ожидать - это просто указатели на строки. Сами струны не разрушены. Только указатели есть. delete
никогда не вызывается по указателям.
Показательный пример:
map<char*, char*> strings;
char* key = new char[10];
char* value = new char[256];
/* ... */
strings.insert(key,value);
В приведенном выше примере, поскольку delete
никогда не вызывается для указателей, созданных при вызовах new
, эта память будет просачиваться, когда strings
выходит из области видимости.
Это хорошая иллюстрация того, почему вы должны избегать использования необработанных указателей new
и delete
. В вашем случае, map<string,string>
, вероятно, будет лучшим выбором.
EDIT:
Как уже упоминалось в комментариях @sbi, еще одна причина, по которой вам нужно, чтобы map<string,string>
превышала map<char*,char*>
, заключается в том, что с map<string,string>
ключи сравниваются по значению, а не по значению указателя.
Рассмотрим:
#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";
}
По сути, вы вставляете элемент с ключом "foo", а затем ищете этот элемент. Протестируйте приведенный выше код, и вы обнаружите, что он не найден. Однако, если вы попробуете это:
#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";
}
... вы получаете поведение, которое действительно хотели.