C++ 向类传递指针时,谁应该管理资源?

C++ 向类传递指针时,谁应该管理资源?,c++,C++,我正在为游戏创建一个gui api。例如,我为每个小部件提供了一种字体*。现在我有了它,所以我永远不会管理它们的内存(出于明显的原因),因为我认为用户可以使用智能指针来管理内存。它的缺点是它不是很能证明傻瓜的。如果用户按如下方式设置字体: obj.setFont(new Font("")); 这会立即导致内存泄漏,因为没有人会释放它。唯一的方法是删除getFont() 我来管理这些会更好吗 谢谢调用者应负责管理调用者范围内对象的内存 这就是说,在这种情况下,您应该真正使用智能指针,因为当它们不

我正在为游戏创建一个gui api。例如,我为每个小部件提供了一种字体*。现在我有了它,所以我永远不会管理它们的内存(出于明显的原因),因为我认为用户可以使用智能指针来管理内存。它的缺点是它不是很能证明傻瓜的。如果用户按如下方式设置字体:

obj.setFont(new Font(""));
这会立即导致内存泄漏,因为没有人会释放它。唯一的方法是删除getFont()

我来管理这些会更好吗


谢谢

调用者应负责管理调用者范围内对象的内存


这就是说,在这种情况下,您应该真正使用智能指针,因为当它们不再使用时,它们会释放自己。

这就是所有权转移的问题

但是:您可以将接口重写为

void obj.setFont( SmartPtr<Font> font );
void obj.setFont(SmartPtr字体);

因为这样你就迫使用户使用智能指针。

你可以决定你的库是否应该拥有资源的所有权,但无论你选择什么,都要通过界面(而不仅仅是通过注释或文档)明确说明

  • 在C++03中,明确表示您实际拥有所有权的一个好方法是以
    std::auto_ptr
    的形式接收参数:客户机将毫无疑问地转移所有权
  • 另一方面,通过const reference接收参数应该清楚地表明您不打算删除数据(您不可能首先知道它是否是新的)

无论如何,使用智能指针可能会有助于解决这些问题。

尽可能获取每个常量引用的参数,在其他地方使用智能指针,仔细定义什么实例拥有什么其他实例(即什么定义了对象的生命周期)。您不必为键入以下内容的人负责:
obj.setFont(新字体(“”)
比您可以负责某人键入新字体(“”)更多一行,我不想使用智能指针,因为我希望我的库是C++ 03complaint@Milo如果你使用智能指针,你的库怎么会不符合C++03?我想+1@Milo:Boost不是一个选项吧@Jacob Relkin:智能指针不一定释放指针对象:您可以创建一个指向堆栈分配实例的智能指针,该实例带有null deleter,并在函数中透明地使用它。@Milo-哦,我明白了,您希望只依赖标准libs和您编写的任何内容,而不依赖外部依赖项。我不同意。它的运行方式与几乎所有的UI库都相反,因此与直觉相反。大多数UI库都提供了OP所描述的使用类型。谁应该管理一个资源,并不一定,事实上,通常不是由谁创建的。谁应该管理它,就是谁被认为拥有它。在这种情况下,对象的字体似乎非常合适。我会同意这个答案,除非智能指针或引用不一定是必需的。如果您的所有权规则是一致的,用户只需要学习几件事情就可以知道什么是什么,那么智能指针可能会被过度使用,并且可能不合适,这取决于您拥有的集合(例如,共享的ptr不是所有权转移的好选择)。