beim Beenden der folgenden kleinen Bsp.-Qt-Applikation tritt manchmal ein Speicherzugriffsfehler auf. (Oftmaliges Probieren notwendig)
Lässt man das Programm mit valgrind laufen, erhält man folgende Fehlermeldung:
Das gleiche Phänomen tritt auch bei Verwendung eines QLabels auf. Allerdings konnte ich diesen Fehlerfall in einer kleinen Applikation nicht reproduzieren.==7957== Invalid read of size 4
==7957== at 0x4979040: QCursor::~QCursor() (in /usr/lib/libQtGui.so.4.4.3)
==7957== by 0x49AF333: QWidgetPrivate::deleteExtra() (in /usr/lib/libQtGui.so.4.4.3)
==7957== by 0x49AF614: QWidgetPrivate::~QWidgetPrivate() (in /usr/lib/libQtGui.so.4.4.3)
==7957== by 0x4558EE: QObject::~QObject() (in /usr/lib/libQtCore.so.4.4.3)
==7957== by 0x49B452A: QWidget::~QWidget() (in /usr/lib/libQtGui.so.4.4.3)
==7957== by 0x44F400: QObjectPrivate::deleteChildren() (in /usr/lib/libQtCore.so.4.4.3)
==7957== by 0x49B3DC3: QWidget::~QWidget() (in /usr/lib/libQtGui.so.4.4.3)
==7957== by 0x4D001D0: QFrame::~QFrame() (in /usr/lib/libQtGui.so.4.4.3)
==7957== by 0x4D95F3C: QAbstractScrollArea::~QAbstractScrollArea() (in /usr/lib/libQtGui.so.4.4.3)
==7957== by 0x4D79280: QTextEdit::~QTextEdit() (in /usr/lib/libQtGui.so.4.4.3)
==7957== by 0x804B456: ETerminal::~ETerminal() (epicture.cpp:18 )
==7957== by 0x6DF63D: exit (in /lib/libc-2.7.so)
==7957== Address 0x4489F18 is 0 bytes inside a block of size 68 free'd
==7957== at 0x4004E56: operator delete(void*) (vg_replace_malloc.c:244)
==7957== by 0x4978985: (within /usr/lib/libQtGui.so.4.4.3)
==7957== by 0x49C9D4E: (within /usr/lib/libQtGui.so.4.4.3)
==7957== by 0x496BC0E: QApplication::~QApplication() (in /usr/lib/libQtGui.so.4.4.3)
==7957== by 0x804B09A: main (main.cpp:10)
Die Bsp.Applikation ist wie folgt aufgebaut:
Code: Alles auswählen
*-*-*-*-*-*-*-*-*-main.cpp*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#include <QApplication>
#include "ebsp.h"
/
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ETerminal::getInst().show();
return a.exec();
}
/*-*-*-*-*-*-*-*-*-ebsp.cpp*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#include "ebsp.h"
ETerminal::ETerminal(QWidget *parent):
QWidget(parent),
_EditField(this)
{
setGeometry(0,0, 320, 240);
_EditField.init("x Start");
}
ETerminal::~ETerminal()
{
}
ETerminal& ETerminal::getInst(){
static ETerminal instance;
return instance;
}
EEditField::EEditField(QWidget* p):
QTextEdit(p)
{
setEnabled(true);
setFocusPolicy(Qt::TabFocus);
//setFrame(false);
setFrameShape(QFrame::NoFrame);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setTextInteractionFlags(Qt::TextSelectableByKeyboard);
setContextMenuPolicy(Qt::NoContextMenu);
setLineWrapMode(QTextEdit::NoWrap);
setWordWrapMode(QTextOption::NoWrap);
setOverwriteMode(true);
setReadOnly(true);
}
EEditField::~EEditField()
{
}
void EEditField::init (const QString& text){
setPlainText(text);
QTextCursor myCursor(textCursor());
myCursor.setPosition(0, QTextCursor::MoveAnchor);
//myCursor.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor);
myCursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor);
setTextCursor(myCursor);
}
void EEditField::keyPressEvent (QKeyEvent* ev){
if (ev) {
unsigned int key = ev->key();
if ( (Qt::Key)key == Qt::Key_Left) {
// Zeige Wert A an
QTextCursor myCursor(textCursor());
myCursor.removeSelectedText();
QString temp(toPlainText());
temp.insert(myCursor.position(), "A");
setPlainText(temp);
myCursor.setPosition(0, QTextCursor::MoveAnchor);
//myCursor.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor);
myCursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor);
setTextCursor(myCursor);
}
else if ( (Qt::Key)key == Qt::Key_Right) {
// Zeige Wert A an
QTextCursor myCursor(textCursor());
myCursor.removeSelectedText();
QString temp(toPlainText());
temp.insert(myCursor.position(), "B");
setPlainText(temp);
myCursor.setPosition(0, QTextCursor::MoveAnchor);
//myCursor.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor);
myCursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor);
setTextCursor(myCursor);
}
}
}
Vielleicht jage ich ja dort einen Blindgänger, jedoch tritt dieser Speicherfehler bei meiner großen Applikation ziemlich häufig auf, was natürlich nicht so schön ist.
Vielleicht erkennt ja jemand einen bösen Code-Fehler oder sonstiges - ich würde mich über jeden Tipp freuen.
Danke, Grüße
L.Kantack