Я использую библиотеку 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, который может вызвать это, тем временем я буду продолжать отлаживать проблему.
EDIT с минимальным кодом. 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
объект query
mysql++, который имеет данные из базы данных). Время от времени session
может иметь свое значение, измененное в строке session=tmp;
(где tmp - еще один объект session_data). Во всех остальных случаях переменные в session
используются по значению, например, в session.account
, поэтому я не думаю, что они должны вызвать проблему. Надеюсь, это поможет людям немного больше.
Мои умственные навыки отладки говорят мне, что ваш объект Session
был удален дважды, или что он неправильно реализует правило-of-(0, 3, 5) и что один из его членов получил двойное удаление (скорее всего, после мелкой скопированы или назначены).
Session
, хотя я не думал, что это необходимо, поскольку я не использую указатели, которые требуют особого обращения. Я рад, что мне сказали, что я не прав.