我正在将一些代码从 Objective C 移植到 C++。我对 C++ 设计模式不像对 Objective C 那样熟悉。在 Cocoa 世界中,有一种非常常见的模式是编写返回“自动释放”对象的工厂方法。一些简单的事情:
- (MyClass *)load {
MyClass* obj = [[MyClass alloc] init];
return [obj autorelease];
}
这是简单易懂的。该方法拥有它分配的内存,但可以将其交还给调用者,同时放弃所有权。它不必知道或关心调用者对该内存做了什么。如果它保留它,该对象将继续存在。如果它被完全忽略,内存将在当前调用堆栈展开后的某个时间被释放。
我在 C++ 中有些不安地处理这个问题,因为它的非 ref-counted 环境似乎没有任何像autorelease
Cocoa 框架中定义的那样干净的东西,或者任何类型的所有权政策。C++ 中这种模式的最佳实践是什么?
我知道 auto_ptr,但它的使用也有很多问题,而且它似乎有太多缺点而不能像普遍存在的那样autorelease
(奇怪的复制语义、不支持数组、与 STL 容器不兼容等)。
Boost 智能指针也是一个明显的候选者,有些甚至实现了自己的引用计数。不过,对于这么平凡的事情,不得不依靠 3rd 方库对我来说似乎有点奇怪。
C 的另一个选择是不释放返回的内存,而是通过常用的命名约定表明调用者现在拥有返回的对象。这似乎有点陈旧,如果调用者不小心忽略了返回值,很容易出现不可见的泄漏。