使指针 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 定义,以便我们有更多信息来形成正确的解决方案。
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 定义,以便我们有更多信息来形成正确的解决方案。