我想在我的C ++项目中自动处理内存。
我不介意为了获得这种自动内存处理而有一些额外的约定 - 具体来说,我不介意在创建新的对象实例时有一些特殊的编码(但当然,不是更多的它打败了目的)。
在对stackoverflow中的许多有用讨论进行了一些阅读之后,我发现“智能指针”被引用最多(以及第三方c ++垃圾收集器的一些参考)。
由于只配备了一些“教科书”C ++知识,我相信C ++ GC的复杂性使得它们不值得使用,就我而言。
另一方面,我有.NET / Java背景,并且想在C ++上利用这种经验。我习惯于创建对象实例并将它们传递给其他类/函数(我相信它也是C ++中的一些面包和黄油的东西)。
那么,智能指针/ shared_ptr / boost是我要找的吗?
(请注意,对于内存获取,我的意思是执行MyClass* var = new MyClass()
,而不是malloc()
。)
一些具体背景:
实际上我正在尝试做的是编写一些可以在C ++项目和iPhone项目中使用的库函数(请注意,这些是纯粹的逻辑业务类,因此应该没有可移植性问题)。虽然我认为它不是一个需要高性能的领域(iPhone的非游戏应用程序),但我对资源使用有一些顾虑。
在这种情况下使用智能指针有什么问题吗?还有更好的选择吗?
答案 0 :(得分:0)
考虑引用计数?创建一个基类,该基类保持引用频率的计数,并在引用计数降至零时删除自身。
class RefCounter
{
public:
RefCounter() : mRefCount(1) { }
virtual ~RefCounter() { }
void retain() { mRefCounter++; }
void release() {
if(mRefCount) mRefCount--;
if(!mRefCount) delete this;
}
protected:
unsigned int mRefCounter;
};
任何需要实例的引用对象都会调用它的retain()函数,完成后会调用release()。调用release的最后一个对象将导致实例自行删除。您必须小心平衡保留和释放,但这种技术本质上是GC的工作方式,除了GC实现隐藏此引用计数。
我在自动GC变得风靡一时之前学会了C ++,而且我从来没有真正对这个概念感到温暖,感觉更安全,知道每个字节的内存分配和释放的时间和地点。但那只是我。