繁体   English   中英

自动C ++内存/对象实例管理? 智能指针?

[英]automatic C++ memory/object instance management? smart pointers?

我想在我的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 ++,但我从未真正热衷于这个概念,因为确切地知道何时分配内存的每个字节以及何时释放它们,使我感到更加安全。 但这就是我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM