std :: string пытается освободить неправильную память

0

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

  • 1
    Покажите нам код.
  • 0
    Моя проблема в том, что я не знаю, какой код лучше. Весь мой проект слишком велик, чтобы поместить его здесь, но, как следует из вопроса, любые меньшие версии пока не выдают такой же ошибки. Извините, я не пытаюсь быть бесполезным.
Показать ещё 6 комментариев
Теги:
gcc
stdstring
mysql++

1 ответ

1
Лучший ответ

Мои умственные навыки отладки говорят мне, что ваш объект Session был удален дважды, или что он неправильно реализует правило-of-(0, 3, 5) и что один из его членов получил двойное удаление (скорее всего, после мелкой скопированы или назначены).

  • 2
    Выведи Вальгринда!
  • 0
    Вы правы в том, что я не реализовал свой собственный деструктор для Session , хотя я не думал, что это необходимо, поскольку я не использую указатели, которые требуют особого обращения. Я рад, что мне сказали, что я не прав.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню