std::string пытается освободить неправильную память
Я использую библиотеку mysql++ (v3.1.0) в проекте C++ (скомпилированном с GCC 4.8.1) в среде Linux, и у меня есть объект ssqls в качестве члена класса (session_data
) из класса, который я сделал (Session
). Все работает нормально, пока экземпляр моего класса не будет уничтожен, после чего std::string
объект пытается освободить часть памяти, которой у него нет, что заставляет ядро вмешаться. Ниже приведена часть трассировки стека, предоставленной GDB после сбоя.
#2 0x00c143ea in abort () from /lib/libc.so.6
#3 0x00c529d5 in __libc_message () from /lib/libc.so.6
#4 0x00c58e31 in malloc_printerr () from /lib/libc.so.6
#5 0x00c5b571 in _int_free () from /lib/libc.so.6
#6 0x0810e43f in operator delete(void*) () at ../../../../gcc-4.8.1/libstdc++-v3/libsupc++/del_op.cc:47
#7 0x081518eb in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_M_destroy(std::allocator<char> const&) ()
at /include/ext/new_allocator.h:110
#8 0x08151930 in std::string::_Rep::_M_dispose ()
at /include/bits/basic_string.h:249
#9 0x0815199e in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() ()
at /include/bits/basic_string.h:539
#10 0x080ac492 in session_data::~session_data() ()
at sql_tables.h:80
#11 0x080ac537 in Session::~Session() ()
at session.cpp:5
Все эти деструкторы создаются на лету, и я не могу установить точку останова внутри них, потому что они не существуют в соответствии с GDB. Лично я сомневаюсь, что это ошибка в коде, созданном GCC, что заставляет меня предположить, что я каким-то образом "неправильно обработал" объект ssqls. Пока что мои попытки воспроизвести ошибку в меньшем проекте не увенчались успехом, но если я справлюсь с этим, я обязательно опубликую этот код здесь. На самом деле я хотел бы знать, есть ли у кого-нибудь какие-либо идеи о том, что происходит внутри объекта ssqls, который может быть причиной этого, тем временем я буду пытаться отладить проблему.
РЕДАКТИРОВАТЬ с минимальным кодом.session_data
полностью исключается макросами ssqls, которые я называю так:
sql_create_7(session_data, 4,7, sql_varchar, id,
sql_text, last_ip,
sql_text, last_user_agent,
sql_datetime, expires,
sql_text, account,
sql_text, messages,
sql_text, login_key)
Класс Session
заполняет значение session_data
от:
mysqlpp::StoreQueryResult res=query.store();
session=res[0];
(С session_data session
будучи членом класса, и query
объект запроса mysql++, который имеет данные из базы данных) Время от времени session
может иметь значение, измененное строкой session=tmp;
(где tmp - другой объект session_data). Во всех остальных случаях переменные внутри session
используются по значению, например, в session.account
поэтому я не думаю, что они должны вызывать проблемы. Надеюсь, это поможет людям немного больше.
1 ответ
Мои психические навыки отладки говорят мне, что ваш Session
объект был дважды удален, ИЛИ что он должным образом не реализует правило (0, 3, 5) и что один из его членов был удален дважды (скорее всего, после мелкого копирования или назначения).