Обнаружен glibc: free(): неверный указатель: с простым примером boost::ptr_map

Я знаю, что есть множество вопросов с "* glibc обнаружено * free (): неверный указатель", но следующий пример является минималистским с boost::ptr_map:

#include <boost/ptr_container/ptr_map.hpp>
#include <string>

int main() {
        boost::ptr_map<std::string, int> map;
        int one = 1;
        int* pone = &one;
        string un = "one";
        map.insert(un, pone);
}

Код компилируется, но во время выполнения:

boost.library/ptr_container $ ./run.ptrmap
*** glibc detected *** ./run.ptrmap: free(): invalid pointer: 0x00007ffffd5c4578 ***
======= Backtrace: =========
/lib/libc.so.6[0x7fd5e99202f6]
/lib/libc.so.6(cfree+0x6c)[0x7fd5e9924c6c]
./run.ptrmap[0x401066]
/lib/libc.so.6(__libc_start_main+0xfd)[0x7fd5e98c8abd]
./run.ptrmap[0x400e79]
======= Memory map: ========
etc..

Повсюду в SO повторяется, что такая ошибка возникает при попытке удалить недопустимый указатель. Однако какие изменения в приведенном выше очень простом коде предотвратят эту ошибку?

Подоплекой этого вопроса является то, что я пытаюсь понять правильное использование boost::ptr_map. К сожалению, официальная документация по бусту очень скудна с точки зрения ptr_map (нет учебника, нет примера с ptr_map). Похоже, в Интернете нет учебника boost::ptr_map. У меня проблемы с получением значений и доступом к методам для сопоставленных классов, которые я создал. Таким образом, я попытался создать самый простой пример, который только мог, но плохо стартовал, как показано выше.

Любая помощь с ошибкой glibc выше и с ptr_map в целом приветствуется. Благодарю.

Изменить: я прочитал более 20 раз, изучил и скопировал примеры из официального учебника по повышению http://www.boost.org/doc/libs/1_46_0/libs/ptr_container/doc/tutorial.html Как указано выше, повышение учебник едва охватывает ptr_map, поэтому ссылки на него не будут иметь никакого значения. По сути, я много раз просматривал и изучал всю инструкцию по контейнеру boost ptr.

1 ответ

Решение

Учебное пособие: http://www.boost.org/doc/libs/1_39_0/libs/ptr_container/doc/tutorial.html (найдено для поиска в Google: boost ptr_map)

ptr_map берет на себя владение указателями, которые ему даны, поэтому ему нужно дать выделенную кучу (new) объекты. Вы дали ему указатель на объект, выделенный из стека, поэтому, когда ptr_map очищен, он пытается delete то, что находится в стеке.

Другие вопросы по тегам