C++ Qt 表达式 : _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) error

标签 c++ qt pointers memory-leaks

我想弄清楚为什么会出现此错误。我已经看到很多关于相同的问题/答案,但我只是没有看到任何可能导致我的代码出现此错误的原因。

根据我一直在做的研究,这个错误的可能原因是:

1 - 我不止一次删除对象

2 - 卷影复制

3 - 我正在创建和删除从外部 dll 加载的对象

4 - 我正在创建对象而不存储指针

这是我的代码:

TreeView.h

 #pragma once
 #include <QtWidgets/qapplication.h>
 #include <QtWidgets/QTreeView>
 #include <QtWidgets/QTreeWidgetItem>
 #include <QtWidgets\qfilesystemmodel.h>
 #include <QtWidgets/qmainwindow.h>
 #include <QtWidgets/QVBoxLayout>
 #include <QtWidgets/QDirModel>
 #include <QtCore/QDebug>
 #include <QtCore\qtimer.h>
 #include <iostream>
 #include <QtCore\qmap.h>
 #include <QtWidgets/QFileDialog>
 #include <QtWidgets/qpushbutton.h>

using namespace std;

class Tree: public QTreeView {  
    Q_OBJECT
public:

    QFileSystemModel *model;
    QPushButton *button;

    Tree(QWidget *parent = 0):QTreeView(parent){
        this->resize(200,600);
        //create the tree  
        string directory = "C:\\Users\\Alloisio\\Documents\\Visual Studio 2012\\Projects\\TreeView\\TreeWidget\\Indicators\\Factores";
        model = new QFileSystemModel(this);
        model->setRootPath( directory.c_str());
        this->setModel(model);
        this->setRootIndex(model->setRootPath(directory.c_str()));

        this->setSelectionMode(QAbstractItemView::ExtendedSelection); //allow multi select with Ctrl 

        //button
        button = new QPushButton(this);
        button->setText("Display Selected");
        button->move(30,600);

        QObject::connect(button, SIGNAL (clicked()), this, SLOT (muitiselect()));
    }

    public slots:
        void muitiselect(){
            this->selectionModel()->selectedIndexes();
        }
};

源.cpp

#include "TreeView.h"

int main(int argc, char *argv[]){
     QApplication app(argc, argv);
     Tree *tree = new Tree;
     tree->show();
     app.exec();
}

这是我发现的。执行函数后立即出现错误:

void muitiselect(){
    this->selectionModel()->selectedIndexes();
}

非常感谢任何形式的帮助。提前谢谢你。

最佳答案

您似乎通过动态分配事物并允许 Qt 清理它们来做所有正确的事情;然而,有一个例子你没有这样做,那就是:

QWidget widget;
QHBoxLayout horizontalLayout(&widget);

在这里,当 horizo​​ntalLayout 被销毁时,它会销毁 widget,它也会在其范围结束时尝试销毁自身。尝试:

QWidget* widget = new QWidget();
QHBoxLayout horizontalLayout(widget);

参见 QLayout::addWidget内部使用 QLayout::addItem

Note: The ownership of item is transferred to the layout, and it's the layout's responsibility to delete it.

关于C++ Qt 表达式 : _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30856863/

相关文章:

c - 访问通过引用传递给函数的双指针二维数组

c++ - 将指针转换为 int/将指针存储为类型 T

c# - C++ 到 C# : PInvoke\Marshaling a callback with a complex type

c++ - TinyXML 在最后位置插入。

c++ - 初始化 QList<MyStruct> 作为静态类成员给出 LNK2001 错误

qt - 如何让 Qt 5.0 与 Qt Creator 2.5.2 一起工作?

c++ - 模板-无法将函数定义与现有声明c++匹配

c++ - 如何在基类型引用中存储对派生类型的引用?

c++ - QImage:如何将灰度图像转换为 RGB 热图

c++指针的内存分配过程