我希望在我的C++项目中有自动内存处理。
我不介意有一些额外的约定来获得这种自动内存处理——具体地说,我不介意在创建新的对象实例时有一些特殊的编码(当然,不要更多,因为这会破坏目的)。
在阅读了stackoverflow中的许多有用讨论后,我发现"智能指针"被引用最多(还有一些第三方c++垃圾收集器的引用)。
由于只有一些"教科书式"的C++知识,我认为C++GC的复杂性使它们不值得使用,就我而言。
另一方面,我有.NET/Java背景,我也想在C++上利用这一经验。我习惯于创建对象实例并将它们传递给其他类/函数(我相信这在C++中也是一些面包和黄油的东西)。
那么,智能指针/shared_ptr/boost是我想要的吗?
(注意,对于内存获取,我指的是进行MyClass* var = new MyClass()
,而不是malloc()
。)
一些特定背景:
事实上,我正试图写一些库函数,这些函数可以在C++项目和iPhone项目中使用(请注意,这些是一些纯逻辑的业务类,因此不应该存在可移植性问题)。虽然我认为这不是一个需要高性能的领域(iPhone的非游戏应用程序),但我对资源使用有一些担忧。
在这种情况下使用智能指针有什么问题吗?还有更好的选择吗?
是否考虑引用计数?创建一个基类,该基类记录它被引用的频率,并在引用次数降至零时删除它自己。
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++,而且我从未真正对这个概念感兴趣,因为我知道每个字节的内存是在何时何地分配和释放的,我感到更加安全。但那只是我。