unique_ptr,qvector.resize()抛出错误2280,试图引用已删除的函数

时间:2018-01-12 10:03:20

标签: c++ windows-7 qt5 smart-pointers qvector

为防止范围蔓延(在previous Q上),我已将上述错误隔离开。

我的体素类定义:

#ifndef VOXEL_H
#define VOXEL_H

#include <QObject>
#include <QVector>
#include <iostream>
include <memory>

class Voxel : public QObject
{
    Q_OBJECT
public:
    Voxel();
    ~Voxel();
};

#endif // VOXEL_H

触发错误的主文件:

#include <voxel.h>

int main(int argc, char *argv[])
{
    QVector < QVector <std::unique_ptr <Voxel> > > cVoxel;

    cVoxel.resize(0);

    int rows = 80, cols = 80;

    for (int i = 0; i < rows; i++)
    {
       cVoxel[i].resize(cols);
       for (int j = 0; j < cols; j++)
       {
          cVoxel[i][j].reset(new Voxel);
       }
    }
}

最终抛出错误的一行是:

cVoxel[i].resize(cols);

完整的错误跟踪:(并不能说错误最终成为主要错误)

enter image description here

关于此错误还有其他问题(that are helpful),但我无法完全理解如何解决此问题。似乎qvector.resize()正在尝试重新分配并可能使用复制构造函数,然后抛出此错误?我可以手动释放内存而不是使用上面的函数,但使用智能指针的整个理想是避免内存泄漏...我开始使用unique_ptr来解决大量泄漏问题。

我使用的是QtCreator 4.4.0和Qt 5.6.2,64位。

---编辑---

如果我将QVector替换为std::vector,即cVoxel创建为:

std::vector < std::vector <std::unique_ptr <Voxel> > > cVoxel;

然后程序在外部for循环中崩溃,在:

cVoxel[i].resize(cols);

调试显示:

  

Debug Assertion失败!

     

程序:C:\ windows \ system32 \ MSVCP140D.dll   文件:C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ INCLUDE \ vector   行:1234

     

表达式:向量下标超出范围

     

有关程序如何导致断言的信息   失败,请参阅关于断言的Visual C ++文档。

我可以通过将cVoxel的大小调整为80而不是0来获得代码。但是,QVector.resize()std::vector.resize()的运行方式之间存在细微差别。阅读每篇文档,它们看起来完全相同。

1 个答案:

答案 0 :(得分:1)

unique_ptr无法复制(仅移动或移动分配):

  

类(unique_ptr)满足MoveConstructible和的要求   MoveAssignable,但不是CopyConstructible的要求   或CopyAssignable。

复制构造函数和复制分配在unique_ptr中删除,因此出错。 cVoxel[i].resize(cols)隐式要求复制。 您可以使用QVector<QVector<Voxel>>作为替代方案。

另一件事:cVoxel[i].resize(cols)之后调用cVoxel.resize(0)超出范围。您可能需要cVoxel.resize(rows)

相关问题