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) и что один из его членов был удален дважды (скорее всего, после мелкого копирования или назначения).

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