gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:05:47 25 4
gpt4 key购买 nike

为了防止范围蔓延(在 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 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() 之间存在细微差别。和 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[i].resize(cols)cVoxel.resize(0) 之后出界了。你可能需要 cVoxel.resize(rows) .

关于c++ - unique_ptr, qvector.resize() 抛出错误 2280 试图引用已删除的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48223804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com