【问题标题】:Heap overrun error is resolved by removing a heap allocated variable?通过删除堆分配的变量来解决堆溢出错误?
【发布时间】: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 中删除pointer2valgrind 错误不会出现。删除对 _dataAuditModel 的所有引用也可以解决该错误。

由于我实际上并没有在这个类中调用newmalloc,所以我不明白自动堆分配如何导致这样的错误。我觉得我在调查这个错误时处于死胡同。

我做错了什么,或者接下来哪里有好地方?

注意:MAIN_WINDOW 是一个全局定义的MainWindow 指针,从Globals.h 拉入

【问题讨论】:

  • 不要使用原始指针,您不会出现内存管理错误。

标签: c++ qt debugging heap-memory valgrind


【解决方案1】:

出乎意料,实际错误出现在我选择不包含的代码中:

class IAWidgetModelOwner : public IAWidget
{
    Q_OBJECT
public:

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

  1. 删除Q_OBJECT
  2. 定义一个槽public slot: mySlot() {}

实际上,我认为我将其中一个成员函数声明为槽。

【讨论】:

  • 后来,我又遇到了类似的问题,通过清理我的Qt项目并重建解决了。
【解决方案2】:

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

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

【讨论】:

  • 非常感谢您发布此信息。虽然它没有引导我找到我的实际解决方案,但它极大地帮助了我准确理解问题所在并帮助我进行调试。谢谢!
猜你喜欢
  • 2020-01-11
  • 1970-01-01
  • 2019-07-05
  • 2011-05-16
  • 2017-09-22
  • 1970-01-01
  • 2014-02-25
  • 2011-10-30
  • 1970-01-01
相关资源
最近更新 更多