使指针Getter使用unique_ptr

Make Pointer Getter use unique_ptr

本文关键字:ptr unique 使用 指针 Getter      更新时间:2023-10-16
sf::RectangleShape* operator()()
{
    return &player;
} // RectangleShape Getter

需要在getter之后释放内存吗?如果是,如何对unique_ptr进行此操作?

我试着

std::unique_ptr<sf::RectangleShape> operator()()
{
    return std::unique_ptr<sf::RectangleShape>(player);
} // RectangleShape Getter

但是它说没有匹配圆括号操作符的函数。还应该怎么做呢?

sf::RectangleShape* operator()()
{
    return &player;
} // RectangleShape Getter

需要在getter之后释放内存吗?

你所做的就是返回一个指向player的指针。假设它是上述成员函数所属的结构/类的成员变量,那么它的生命周期将绑定到调用该函数的对象的生命周期。

这尤其意味着这是一个坏主意:

struct Foo {
  sf::RectangleShape player;
  // ...
  // insert your operator here
};
sf::RectangleShape * some_function(void) {
  Foo f;
  return f(); // UB, returning pointer to object with automatic memory whose lifetime has ended
}

[. .如何在unique_ptr中做到这一点?

假设sf::RectangleShape有一个复制构造函数,那么你可以复制player:

std::unique_ptr<sf::RectangleShape> operator()() {
  return make_unique<sf::RectangleShape>(player);
}

你得到的副本是"你的",也就是说,你可以随心所欲地管理它的生命周期。

似乎player是一个类的成员,你正试图拿出一个指向它的指针,让它在类外修改?

在这种情况下,它所属的类拥有内存,并且当数据被销毁时,由该类处理释放数据。指向该成员的指针绝对不能从类外部释放。

这将有助于有更多的信息,关于拥有的类,但如果我可以假设player是一个数据成员,那么你的第一个例子在技术上是好的。然而,通常返回引用比返回指针更习惯。

class SomeClass
{
    sf::RectangleShape player;
    sf::RectangleShape& operator()()
    {
        return player;
    }
};

如果上面的假设是不正确的,你应该展示你的完整的类定义,以便我们有更多的信息来形成一个正确的解决方案。