Как выделить ключ карты с помощью 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

person 15412s    schedule 27.06.2016    source источник
comment
Почему бы не использовать std::string?   -  person NathanOliver    schedule 27.06.2016
comment
Сколько символов в строке "hhhhh"? Включая терминатор?   -  person Some programmer dude    schedule 27.06.2016
comment
malloc не имеет к делу никакого отношения. Ваши ключи являются указателями. Подумайте, что значит сравнивать указатели.   -  person juanchopanza    schedule 27.06.2016
comment
если вы решите использовать указатели в качестве ключа, вы получите указатели в качестве ключей, и, конечно, они могут указывать на одно и то же значение. Так зачем ты это делаешь? Просто используйте значения в качестве ключей, чтобы получить правильное поведение   -  person 463035818_is_not_a_number    schedule 27.06.2016
comment
один из классов в коде печатает значения карты в своем деструкторе, но с std::string кажется, что значение было уничтожено   -  person 15412s    schedule 27.06.2016
comment
Проблема, с которой вы столкнулись с std::string, совершенно иная и требует нового и другого вопроса.   -  person Some programmer dude    schedule 27.06.2016


Ответы (1)


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

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

person πάντα ῥεῖ    schedule 27.06.2016
comment
один из классов в коде печатает значения карты в своем деструкторе, но с std::string кажется, что значение было уничтожено, и я получаю дамп ядра - person 15412s; 27.06.2016
comment
@ 15412s Ну, это другой вопрос, и, скорее всего, он не связан с использованием std::string в качестве ключа, а с какой-то неправильной логикой в ​​другой части вашей программы. - person πάντα ῥεῖ; 27.06.2016