【发布时间】:2013-08-19 04:12:18
【问题描述】:
在调查 glibc 崩溃时,我收到了 valgrind 错误:
Invalid write of size 8
at 0x43A3D2: DataAudit::DataAudit(DataAuditModel*, QWidget*) (DataAudit.cpp:15)
by 0x42D318: MainWindow::createNewDataAudit(DataAuditModel*) (MainWindow.cpp:191)
by 0x48CA09: MainWindow::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) (moc_MainWindow.cpp:65)
Invalid write of size 8seems to indicate 堆块溢出。
以下是两个问题类别,为简洁起见进行了精简:
class IAWidgetModelOwner : public IAWidget
{
public:
explicit IAWidgetModelOwner(IAWidgetModel *model, QWidget *parent = 0) :
IAWidget(model, parent),
pointer1(MAIN_WINDOW),
pointer2(MAIN_WINDOW) // See note below
{ }
private:
MainWindow *pointer1;
MainWindow *pointer2; // See note below
};
class DataAudit : public IAWidgetModelOwner, public Ui::DataAudit
{
public:
explicit DataAudit(DataAuditModel *dataAuditModel, QWidget *parent = 0) :
IAWidgetModelOwner(dataAuditModel, parent),
_dataAuditModel(dataAuditModel) // DataAudit.cpp:15
{ ... }
...
private:
QList<RawLog*> _rawLogs;
DataAuditModel *_dataAuditModel;
};
令人费解的是,如果我通过注释掉上面指示的行从IAWidgetModelOwner 中删除pointer2,valgrind 错误不会出现。删除对 _dataAuditModel 的所有引用也可以解决该错误。
由于我实际上并没有在这个类中调用new 或malloc,所以我不明白自动堆分配如何导致这样的错误。我觉得我在调查这个错误时处于死胡同。
我做错了什么,或者接下来哪里有好地方?
注意:MAIN_WINDOW 是一个全局定义的MainWindow 指针,从Globals.h 拉入
【问题讨论】:
-
不要使用原始指针,您不会出现内存管理错误。
标签: c++ qt debugging heap-memory valgrind