将成员unique_ptr初始化为空

Pre*_*yne 11 unique-ptr c++11

在我的程序中,我有一堆自定义类Position的对象.职位声明如下:

class Position {
public:
    Position(int x, int y);
    ~Position();

    Actor *getActor()           { return actor.get(); };
    void setActor(Actor *actor) { actor = std::move(actor); };
    Actor *clearActor()         { return actor.release(); };

    int getX()  { return x; };
    int getY()  { return y; };

private:
    int x, y;
    std::unique_ptr<Actor> actor;
};
Run Code Online (Sandbox Code Playgroud)

我还有一个名为Actor的课程.并非每个Position都有一个Actor,因此大多数时候Position对象的unique_ptr"actor"应该为空(我在运行时使用unique_ptrs自动清理与Position关联的任何Actor).

Position构造函数如下:

Position::Position(int x, int y)
{
    this->x = x;
    this->y = y;
    actor.reset(nullptr);
}
Run Code Online (Sandbox Code Playgroud)

但是,我知道这不正确地将存储的指针设置为nullptr,因为当我尝试在Position :: getActor()中调用actor.get()时,我得到如下错误:

____中的0x01096486处的第一次机会异常.exe:0xC0000005:访问冲突读取位置0x00000008.

有没有办法将成员unique_ptr初始化为nullptr?我知道我可以通过向Actor类添加一个变量来定义这个,该变量定义了Actor是否处于活动状态,将unique_ptr设置为新的非活动Actor,并忽略所有不活动的Actors,但我宁愿避免这种情况.

谢谢!

编辑:我已经添加了我调用getActor的代码:

bool Grid::addActor(Actor *actor, int x, int y)
{
    Position *destination = at(x, y);

    if (!destination->getActor()) {
        destination->setActor(actor);
        actor->setPosition(x, y);
        actor->setGrid(this);
        return true;
    }
    else {
        inactive_actors.emplace_back(actor);
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

eml*_*lai 7

你的错误在这里:

void setActor(Actor *actor) { actor = std::move(actor); };
Run Code Online (Sandbox Code Playgroud)

您是分配的结果std::move参数 actor.你可能意味着带有参数reset的成员变量:actoractor

void setActor(Actor *actor) { this->actor.reset(actor); };
Run Code Online (Sandbox Code Playgroud)

作为旁注,您可以简单地将构造函数更改为:

Position::Position(int x, int y)
: x(x), y(y)
{
}
Run Code Online (Sandbox Code Playgroud)

这将初始化成员xy参数,并将default-initialize初始化std::unique_ptr<Actor> actor为null.


Eam*_*ain 5

您不需要将std :: unique指针初始化为null.只需将它作为默认的空值保留在构造函数中,并且只将其重置为指向非空指针.