C++11 std::vector的动态初始化<;独特的_ptr<;T级>&燃气轮机;
我有一个类网格声明如下: 网格.h 无论以何种方式填充C++11 std::vector的动态初始化<;独特的_ptr<;T级>&燃气轮机;,c++11,vector,unique-ptr,C++11,Vector,Unique Ptr,我有一个类网格声明如下: 网格.h 无论以何种方式填充向量,我总是会得到以下错误: CombatSim.exe中0x0087D8A3处的首次机会异常:0xC0000005:访问冲突读取位置0x00000000。 CombatSim.exe中0x0087D8A3处未处理的异常:0xC0000005:访问冲突读取位置0x00000000。 据我所知,我可能有四个问题中的一个: 1) 我错误地将创建的位置对象的唯一\u ptr添加到向量中 2) 我使用了错误的方法动态创建位置对象。 3) 以上所有内容
向量
,我总是会得到以下错误:
CombatSim.exe中0x0087D8A3处的首次机会异常:0xC0000005:访问冲突读取位置0x00000000。
CombatSim.exe中0x0087D8A3处未处理的异常:0xC0000005:访问冲突读取位置0x00000000。
据我所知,我可能有四个问题中的一个:1) 我错误地将创建的位置对象的唯一\u ptr添加到向量中
2) 我使用了错误的方法动态创建位置对象。
3) 以上所有内容。
4) 一些我不知道的事情 调整网格大小似乎会首先插入所有指向
0
的唯一指针。你的push_back
应该很好,但是你的真实元素开始于向量中的位置length_x*length_y
。我想把电话线拆了
grid.resize(length_x * length_y);
应该解决这个问题。也许其他人可以解释为什么会发生这种情况。如果以后要
推回这些n个元素,请使用std::vector::reserve(n)
而不是std::vector::resize(n)
resize
将用初始化对象填充向量,因此vector.size()
之后将为n
reserve
只为所有n元素保留足够的空间,但不会插入任何对象。您必须向我们展示一个程序,我们可以编译并运行该程序来重现问题。你的工作会很好的。您今天调试的那个。谢谢!根据,当调用resize时,“如果n大于当前容器大小,则通过在末尾插入所需数量的元素来扩展内容,以达到n的大小。如果指定了val,则将新元素初始化为val的副本,否则,将对其进行值初始化。”@user0815建议在将所有length\ux*length\uy
元素添加到向量之前,首先为它们保留空间,以避免重复重新分配内存。是的,正确。我误解了前面指出的调整大小
和保留
。因此,这种行为是显而易见的。我希望它能帮上忙。谢谢!事实证明,这解决了我在另一篇文章中描述的问题。
#ifndef DATATEST_POSITION_H
#define DATATEST_POSITION_H
#include <memory>
#include <string>
class Position {
public:
Position(int x, int y);
~Position();
std::string toString();
int getX() { return x; };
int getY() { return y; };
private:
int x, y;
};
#endif
#include "Grid.h"
#include <iostream>
#include <memory>
#include <vector>
#include "Position.h"
Grid::Grid(int length_x, int length_y)
: length_x(length_x), length_y(length_y)
{
grid.resize(length_x * length_y);
for (int x = 0; x < length_x; x++) {
for (int y = 0; y < length_y; y++) {
/* Option 1 */
std::unique_ptr<Position> temp = std::make_unique<Position>(x, y);
grid.push_back(std::move(temp));
/* Option 2 */
// std::unique_ptr<Position> temp = std::make_unique<Position>(x, y);
// grid.emplace_back(std::move(temp));
/* Option 3 */
// grid.push_back(std::make_unique<Position>(x, y));
/* Option 4 */
// grid.emplace_back(std::make_unique<Position>(x, y));
}
}
}
Grid::~Grid()
{
grid.clear();
}
Position *Grid::at(int x, int y)
{
if (x < 0 || x >= length_x || y < 0 || y >= length_y) {
return nullptr;
}
else {
return grid.at(x * (length_y) + y).get();
}
}
void Grid::printGrid()
{
for (int i = 0; i < grid.size(); i++) {
std::cout << grid.at(i)->toString() << std::endl;
}
}
#include "Position.h"
#include <string>
Position::Position(int x, int y)
: x(x), y(y)
{
}
Position::~Position()
{
}
std::string Position::toString()
{
return "Position(" + std::to_string(x) + ", " + std::to_string(y) + ")";
}
#include "Grid.h"
#include "Position.h"
int main()
{
Grid g(2, 2);
g.printGrid();
return 0;
}
grid.resize(length_x * length_y);