通过删除堆分配的变量来解决堆溢出错误?

时间:2013-08-16 17:05:43

标签: c++ qt debugging heap valgrind

在调查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 8 seems 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;
};

令人费解的是,如果我通过注释掉上面指出的行从valgrind移除pointer2,则IAWidgetModelOwner错误不会出现。删除对_dataAuditModel的所有引用也可以解决错误。

由于我实际上并没有在这个类中调用newmalloc,所以我不明白自动堆分配如何导致这样的错误。我觉得我在调查这个错误时已经走到了尽头。

我做错了什么,或者下一个好地方在哪里?

注意:MAIN_WINDOW是从MainWindow

引入的全局定义的Globals.h指针

2 个答案:

答案 0 :(得分:1)

不知何故,MainWindow::createNewDataAudit()没有为您的DataAudit对象分配足够大的对象。将调试工作集中在那里。

由于没有分配足够的内存,初始化指针成员_dataAuditModel会导致溢出。从基类中删除成员pointer2时,您缩小DataAudit对象的大小以适合MainWindow::createNewDataAudit()分配给它的内存。

答案 1 :(得分:0)

令人惊讶的是,实际错误出现在我选择不包含的代码中:

class IAWidgetModelOwner : public IAWidget
{
    Q_OBJECT
public:

我使用了Q_OBJECT宏,但它没有signalslot声明。以下任何一个都解决了我的问题:

  1. 删除Q_OBJECT
  2. 定义广告位public slot: mySlot() {}
  3. 实际上,我认为 已将其中一个成员函数声明为插槽。