LINUX.ORG.RU

что это за фигня *** glibc detected *** ./probe: double free or corruption (out): 0x08322488 ***


0

0

Ситуёвина следующая.
Пишется прога на Qt3
В описание класса добавляется член
p_goods *dgoods;
где p_goods - другой класс.
После чего созерцаем при запуске следующее:
*** glibc detected *** ./probe: double free or corruption (out): 0x08322488 ***
(где-то по непонятной причине якобы делается двойное free())
(прога при этом вываливается)
потом я делаю
export MALLOC_CHECK_=1 - позволяет выводить сообщение об этой ошибке, но не убивать программу. Запускаем прогу. Сообщение об ошибке не выводится.
Делаем обратно: export MALLOC_CHECK_=0 (как было по умолчанию)
Программа перестаёт вываливаться!!!
Это косяк glibc или Qt ?? - Никто не сталкивался с подобным?

gcc (GCC) 4.1.2 20061115 (prerelease)
glibc 2.5


Ну показывай исходник, или сам valgrind'ом потыкай. :)

ero-sennin ★★
()

> Делаем обратно: export MALLOC_CHECK_=0 (как было по умолчанию) Программа перестаёт вываливаться!!!

А ты чего ожидал? :) Иди читай man malloc, там всё написано.

ero-sennin ★★
()
Ответ на: комментарий от Reset

1) man malloc читай сам.

2) есть ешё calloc и, что более важное, alloca - можешь ещё и по ним маны почитать.

3) в исходнике много строк, ооочень много. строки где возникал косяк:

class o_preferences:public QWidget
{
Q_OBJECT
public:
//------dialogs----//
p_passwd *dpasswd;
p_goods *dgoods; //pri dobavlenii etoj strochki poavljalsja kosjak
//--end dialogs----//
QTable *table;
QMap<int,QPushButton *> button;
QMap<int,QString> nameid;
QMap<int,QString> colnameid;
QValueList<int> indexid;
o_preferences(QWidget* prnt=0, const char *name=0, WFlags wf=0);
~o_preferences();
void addcol(int id,QString name,QString colname=0);
virtual void resizeEvent(QResizeEvent *e);
public slots:
};

класс

class p_goods:public QDialog
{
Q_OBJECT
public:
p_goods(QWidget* prnt=0, const char *name=0, bool modal = 0, WFlags wf=0);
~p_goods();
public slots:
int exec();
};

ещё не был описан и реализован полностью, только заготовка - все функции в нём просто пустые.

scyld
() автор топика
Ответ на: комментарий от scyld

1. Ошметки в которых ничего не происходит никому не интересны, давай минимальный код, который компилируется и падает.

2. Если не хочешь показывать код, то прогони valgrind'ом, он все тебе покажет где ты и как неправильно работаешь с памятью

Reset ★★★★★
()
Ответ на: комментарий от Reset

да блин. всё работает, говорю же. всё было в той строчке.

с malloc / free работаю аккуратно.

valgrind говорит

==13456== at 0x4024CD1: memcpy (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==13456== by 0x8081F89: sha512_update (string3.h:51)
==13456== by 0x80758FD: o_login::enter() (o_login.cc:113)
==13456== by 0x80DFD13: o_login::qt_invoke(int, QUObject*) (moc_o_login.cpp:82)
==13456== by 0x43FF3CC: QObject::activate_signal(QConnectionList*, QUObject*) (in /usr/lib/qt3/lib/libqt-mt.so.3.3.7)
==13456== by 0x440000C: QObject::activate_signal(int) (in /usr/lib/qt3/lib/libqt-mt.so.3.3.7)
==13456== by 0x474971B: QLineEdit::returnPressed() (in /usr/lib/qt3/lib/libqt-mt.so.3.3.7)
==13456== by 0x44CBA8C: QLineEdit::keyPressEvent(QKeyEvent*) (in /usr/lib/qt3/lib/libqt-mt.so.3.3.7)
==13456== by 0x4438155: QWidget::event(QEvent*) (in /usr/lib/qt3/lib/libqt-mt.so.3.3.7)
==13456== by 0x44CB2A8: QLineEdit::event(QEvent*) (in /usr/lib/qt3/lib/libqt-mt.so.3.3.7)
==13456== by 0x43A0646: QApplication::internalNotify(QObject*, QEvent*) (in /usr/lib/qt3/lib/libqt-mt.so.3.3.7)
==13456== by 0x43A1967: QApplication::notify(QObject*, QEvent*) (in /usr/lib/qt3/lib/libqt-mt.so.3.3.7)
==13456== Address 0x56DAC97 is not stack'd, malloc'd or (recently) free'd

всегда на QApplication::notify
может это гдето в Qt?

scyld
() автор топика
Ответ на: комментарий от scyld

Нет, дело не в qt а в твоей проге.

string3.h, o_login.cc, moc_o_login.cpp это чьи файлы?

Reset ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.