unique_ptr、qvector.resize() 试图引用已删除的函数时抛出错误 2280
unique_ptr, qvector.resize() throws error 2280 attempting to reference a deleted function
为了防止范围蔓延(在 上),我已经隔离了上述错误。
我的体素class定义:
#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);
完整的错误跟踪:(这并不是说错误最终是主要的)
关于此错误还有其他问题 (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 Failed!
Program: C:\windows\system32\MSVCP140D.dll
File: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\vector
Line: 1234
Expression: vector subscript out of range
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
我可以通过将 cVoxel 的大小调整为 80 而不是 0 来使代码正常工作。但是 QVector.resize()
and std::vector.resize()
的操作方式似乎存在细微差别。阅读每个文档,它们看起来完全相同。
unique_ptr
无法复制(只能移动或移动分配):
The class (unique_ptr
) satisfies the requirements of MoveConstructible and
MoveAssignable, but not the requirements of either CopyConstructible
or CopyAssignable.
复制构造函数和复制赋值在 unique_ptr
中被删除,因此出现错误。 cVoxel[i].resize(cols)
隐式要求复制。
您可以使用 QVector<QVector<Voxel>>
作为替代。
另一件事:在 cVoxel.resize(0)
之后调用 cVoxel[i].resize(cols)
是越界的。你可能需要 cVoxel.resize(rows)
.
为了防止范围蔓延(在
我的体素class定义:
#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);
完整的错误跟踪:(这并不是说错误最终是主要的)
关于此错误还有其他问题 (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 Failed!
Program: C:\windows\system32\MSVCP140D.dll File: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\vector Line: 1234
Expression: vector subscript out of range
For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.
我可以通过将 cVoxel 的大小调整为 80 而不是 0 来使代码正常工作。但是 QVector.resize()
and std::vector.resize()
的操作方式似乎存在细微差别。阅读每个文档,它们看起来完全相同。
unique_ptr
无法复制(只能移动或移动分配):
The class (
unique_ptr
) satisfies the requirements of MoveConstructible and MoveAssignable, but not the requirements of either CopyConstructible or CopyAssignable.
复制构造函数和复制赋值在 unique_ptr
中被删除,因此出现错误。 cVoxel[i].resize(cols)
隐式要求复制。
您可以使用 QVector<QVector<Voxel>>
作为替代。
另一件事:在 cVoxel.resize(0)
之后调用 cVoxel[i].resize(cols)
是越界的。你可能需要 cVoxel.resize(rows)
.