目标C“autorelease”以C标准方式控制对象的生命周期?

目标C“autorelease”以C标准方式控制对象的生命周期?,第1张

概述我正在将一些代码从Objective C移植到C.我对C设计模式的熟悉程度不如我在Objective C中那么熟悉.在 Cocoa世界中,有一种非常常见的编写工厂方法的模式,它返回一个“自动释放”的对象.有些事情很简单: - (MyClass *)load { MyClass* obj = [[MyClass alloc] init]; return [obj autorelea 我正在将一些代码从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之前的版本)是两件事之一:

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

这就是不幸的是,大量的C代码管理内存.它可以工作,只要每个人都知道他们应该做什么以及谁负责什么.
>使用某种形式的智能指针. 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中).

总结

以上是内存溢出为你收集整理的目标C“autorelease”以C标准方式控制对象的生命周期?全部内容,希望文章能够帮你解决目标C“autorelease”以C标准方式控制对象的生命周期?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1244193.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存