Обнаружен 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
то, что находится в стеке.