使指针 Getter 使用 unique_ptr

Make Pointer Getter use unique_ptr

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

Do I need to free memory after this getter?

您所做的只是 return 指向 player 的指针。假设它是 struct/class 的成员变量,上面的成员函数是其中的一部分,那么它的生命周期绑定到你调用该函数的对象的生命周期。

特别是这意味着这是个坏主意:

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
}

[..] how would one do this with unique_ptr?

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

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

您通过这种方式获得的副本是 "yours",即您可以随心所欲地管理整个生命周期。

似乎 player 是 class 的成员,您正在尝试分发指向它的指针以便它在 class?

之外进行修改

在这种情况下,它所属的 class 拥有内存,并且当它被销毁时,由 class 处理释放数据。绝对不应从 class.

外部释放指向该成员的指针

获得有关拥有 class 的更多信息会有所帮助,但如果我可以假设 player 是数据成员,那么您的第一个示例在技术上是可行的。但是,return 引用通常比指针更惯用。

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

如果上述假设不正确,您应该显示完整的 class 定义,以便我们有更多信息来形成正确的解决方案。