繁体   English   中英

目标C“自动释放”在C ++中 - 控制对象生命周期的标准方法?

[英]Objective C “autorelease” in C++ — standard way to control object lifetime?

我正在将一些代码从Objective C移植到C ++。 我不熟悉C ++设计模式,就像我在Objective C中一样。在Cocoa世界中,有一种非常常见的编写工厂方法的模式,它返回一个“自动释放”的对象。 有些事情很简单:

- (MyClass *)load {

    MyClass* obj = [[MyClass alloc] init];
    return [obj autorelease];
}

这很简单易懂。 该方法拥有它分配的内存,但可以将其交还给调用者,同时放弃所有权。 它不必知道或关心调用者对该内存的作用。 如果它保留它,该对象将存活。 如果完全忽略,则在解除当前调用堆栈后的某个时间释放内存。

我在C ++中有些惶恐不安,因为它的非重新计数环境似乎没有像autorelease那样干净,或者任何类型的所有权策略都与Cocoa框架中的定义一样。 C ++中这种模式的最佳实践是什么?

我知道auto_ptr,但是它的使用也存在很多问题,并且它似乎有太多缺点,无法像autorelease一样普遍存在(奇怪的复制语义,不支持数组,与STL容器不兼容等)。

提升智能指针也是一个明显的候选者,有些甚至实现自己的引用计数。 我不得不依靠第三方图书馆来寻找这个世俗的东西,这似乎有点奇怪。

B的另一个选择是释放返回的内存,但是通过通常采用的命名约定来指示调用者现在拥有返回的对象。 这似乎有点陈旧,如果调用者意外忽略返回值,则容易发生隐形泄漏。

C ++ 03世界中的“最佳实践”(即前C ++ 11)是以下两种方式之一:

  1. 没做什么。 这基本上是假设/惯例的内存所有权。 如果函数返回指针,您应该知道谁拥有它。 通常,文档会告诉你。 内存所有权或转让所有权没有特定的语法。

    这就是不幸的是,大量的C ++代码管理内存。 它可以工作,只要每个人都知道他们应该做什么以及谁负责什么。

  2. 使用某种形式的智能指针。 std::auto_ptr是奇数,但它与C ++ 03中的轻量级相同。 不,您不能将它们粘贴在标准容器中,但它确实定义了特定的所有权模式。 boost::shared_ptr是一个更有效的,在许多其他地方更有用。

C ++ 11提供了std::unique_ptr ,它本质上是一个“固定”的auto_ptr 它依赖于C ++ 11语言特性(对象移动),所以你不能只用C ++ 03编写一个。 您可以将它们存储在标准容器和所有东西中。 但你不能只是传递它们。 顾名思义,它们是独一无二的 :只有其中一个可以存在,指向该对象。 当该unique_ptr被销毁时,它会删除它引用的对象。

您只能通过赠送来转移 unique_ptr所有权。 也就是说,您无法共享所有权。 您可以返回所有权,这意味着调用者现在拥有它。 您可以将所有权传递给另一个函数,这意味着该函数拥有它。 但是没有两个实体可以通过unique_ptr拥有一个对象。

unique_ptr将是处理这样的函数的首选方法。 如果用户想要自己非唯一地存储它,那么他们可以将它释放到std::shared_ptr (它也被采用到C ++ 11中)。

我会看一下boost中的shared_ptr

C ++世界都是关于图书馆的。 因为没有人拥有 C ++(与Objective-C不同),所以它随着社区的需要而增长。

那么最像c ++的选项就是使用智能指针..

从我读到的,引用计数指针是你最好的选择,在c ++ 11标准中你可以使用shared_ptr

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM