Bog*_*ogi 3 c++ memory-management visual-c++
我是一个老C#程序员和一个C程序员(没有动态内存分配),但是想学习一些关于Visual C++编程的知识.困扰我的问题与C++中的内存管理有关.在C#中,垃圾收集器负责内存管理,但在C++中,有必要建立一些关于谁负责释放分配的内存的规则.我有一些来自C#的典型场景:
对象放在某种容器中.谁负责释放记忆.如果几个类共享同一个对象怎么办?
工厂模式.我喜欢使用类的层次结构,其中父类有一个创建子对象的方法?
有没有办法向调用方法建议返回的对象是被调用者/调用者的所有权.
我想听听一些关于此的好建议.
Jam*_*lis 12
如果您正确编写代码,则不必担心这一点,至少不要直接.您可以使用图书馆工具,完全自动地为您处理内存管理和其他资源管理,这样您就不必这样做了.
C++提供了比垃圾收集器好得多的东西:它提供了对所有对象的确定性破坏,并且确定性破坏可用于自动管理每个资源的生命周期,这与垃圾收集不同,垃圾收集(在许多常见实现中)仅允许您管理内存自动并使您手动管理需要确定性清理的所有其他资源.
如果动态分配对象,请使用智能指针管理其生命周期.如果您不需要共享所有权,那么您可以使用a std::unique_ptr,这允许您将所有权从一个owener转移到另一个owener.如果确实需要共享所有权,则可以使用a std::shared_ptr,它使用引用计数技术来维护共享所有权.
要记住两条重要规则:
如果你必须delete在C++程序中编写代码,那么代码肯定是错误的. C++为所有资源(包括内存)提供自动生命周期管理,您应该利用它.delete应该出现的唯一地方是库代码,其中实现了资源拥有容器,并且可能是稀有的低级代码.
尽可能处理对象,而不是指向对象的指针. 只要有可能,您应该避免显式动态分配.C++不像C#和Java这样的语言,大多数对象都是在堆上创建的.在C++中通常更好的是在堆栈上创建对象(使用自动变量)并按值返回它们.
要回答您的具体情况:
对象放在某种容器中.谁负责释放记忆.如果几个类共享同一个对象怎么办?
您应该尽可能将对象本身存储在容器中,而不是指向对象的指针.如果由于某种原因需要存储指向对象的指针,则应使用std::vector智能指针的容器(例如a ).如果容器拥有动态分配的对象的唯一所有权,则可以使用std::vector<std::unique_ptr<T>>; 如果容器要共享对象的所有权,则可以使用std::vector<std::shared_ptr<T>>.
工厂模式.我喜欢使用类的层次结构,其中父类有一个创建子对象的方法?
这与前一个场景没有什么不同:如果你有一棵树,那么使用一个std::vector<T>(或者std::vector<std::unique_ptr<T>>如果你需要动态分配的孩子)来拥有孩子就很简单了.
有没有办法向调用方法建议返回的对象是被调用者/调用者的所有权.
如果对象完全由被调用者拥有(例如在a中std::unique_ptr),则可以返回该智能指针; 这样做会将所有权转移给调用者.
如果存在对象的共享所有权(例如,在a中std::shared_ptr),则返回智能指针将使调用者成为所有者之一; 放弃其所有权的最后一个所有者(通过销毁或以其他方式重置std::shared_ptr拥有该对象的所有者)会自动销毁该对象.