2016-06-27 3 views
-1

Если я пытаюсь ниже код, он сохраняет адрес в качестве ключа, а не значения, поэтому «тот же ключ хранится в два раза»Как выделить карту с помощью malloc?

static map<const char *, int> lMap; 
    const char * msg = "hhhhh"; 

    char *buf = (char *) malloc(6); 
    strcpy(buf, msg); 

    lMap.insert(make_pair(buf, 85)); 
    buf = (char *) calloc(5, sizeof (char)); 

    strcpy(buf, msg); 
    lMap.insert(make_pair(msg, 85)); 

    cout << "size: " << lMap.size() << endl; 
    map<const char *, int>::const_iterator it2; 
    for (it2 = lMap.begin(); it2 != lMap.end(); ++it2) { 
     cout << it2->first << " | " << it2->second << endl; 
    } 

напечатанный результат:

size: 2 
hhhhh | 85 
hhhhh | 85 
+3

Почему бы не использовать 'std :: string'? – NathanOliver

+0

Сколько символов является строкой '' hhhhh''? *** Включая *** терминатор? –

+2

'malloc' не имеет ничего общего с проблемой. Ваши ключи - указатели. Подумайте, что значит сравнивать указатели. – juanchopanza

ответ

2

Вы надеваете «т. Вместо этого используйте std::string.

Если вы не предоставили подходящий функтор-компаратор для правильной обработки ключей const char*, вы получите непредвиденные результаты.

+0

Один из классов кода печатает значения карты на своем деструкторе, но с std :: string кажется, что значение было уничтожено, и я получаю основной дамп – 15412s

+1

@ 15412s Ну, это другой вопрос, и, скорее всего, связанные с использованием 'std :: string' в качестве ключа, но некоторая неправильная логика в другой части вашей программы. –

Смежные вопросы