C++11 std::vector的动态初始化<;独特的_ptr<;T级>&燃气轮机;

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) 以上所有内容

我有一个类网格声明如下:

网格.h 无论以何种方式填充
向量
,我总是会得到以下错误:

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);