【发布时间】:2012-01-04 09:02:12
【问题描述】:
我正在将一些代码从 Objective C 移植到 C++。我对 C++ 设计模式不像对 Objective C 那样熟悉。在 Cocoa 世界中,有一种非常常见的模式是编写返回“自动释放”对象的工厂方法。一些简单的事情:
- (MyClass *)load {
MyClass* obj = [[MyClass alloc] init];
return [obj autorelease];
}
这简单易懂。该方法拥有它分配的内存,但可以将其交还给调用者,同时放弃所有权。它不必知道或关心调用者对该内存做了什么。如果它保留它,该对象将继续存在。如果完全忽略,内存将在当前调用堆栈展开后的某个时间被释放。
我在 C++ 中有些不安地处理这个问题,因为它的非引用计数环境似乎没有任何像 autorelease 那样干净的东西,或者任何与可可框架。 C++ 中这种模式的最佳实践是什么?
我知道 auto_ptr,但它的使用也有很多顾虑,而且它似乎有太多缺点,无法像 autorelease 那样无处不在(奇怪的复制语义,不支持数组,与 STL 不兼容容器等)。
Boost 智能指针也是一个明显的候选对象,有些甚至实现了自己的引用计数。不过,对于这么普通的东西,我不得不依靠 3rd 方库,这对我来说似乎有点奇怪。
另一个带有 C 味道的选项是不释放返回的内存,而是通过常用的命名约定表明调用者现在拥有返回的对象。这似乎有点陈旧,如果调用者不小心忽略了返回值,很容易出现不可见的泄漏。
【问题讨论】:
-
“不过,对于这么普通的东西,我不得不依靠第三方图书馆,这似乎有点奇怪。”习惯它。这就是 C++ 中的工作方式:您可以找到满足您需要的库,然后使用它们。内存的所有权在 C++ 中不是语法;它总是手动。
标签: c++ objective-c memory-management ownership