Make Pointer Getter使用unique_ptr

时间:2016-10-08 22:18:28

标签: c++ pointers unique-ptr

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

} // RectangleShape Getter

这个吸气剂后我需要释放内存吗?如果是,那么如何使用unique_ptr执行此操作?

我试过

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

} // RectangleShape Getter

但它表示括号运算符没有匹配函数。怎么办呢?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:0)

def up
  connection.execute(%q{
    update stories
    set story_type = case story_type
      when 'whatever1' then 'Whatever1Story'
      when 'whatever2' then 'Whatever2Story'
    end
  })
end
  

这个吸气剂后我需要释放内存吗?

您所做的就是返回指向sf::RectangleShape* operator()() { return &player; } // RectangleShape Getter 的指针。假设这是struct / class的成员变量,上面的成员函数是其中的一部分,那么它的生命周期就绑定到你用该函数调用该对象的对象的生命周期。

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

player
  

[..]如何使用unique_ptr进行此操作?

假设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 } 有复制构造函数,那么您可以复制sf::RectangleShape

player

你得到的副本是#34;你的&#34;,即你可以根据需要管理你的生命。