首页 / 知识
C ++内存管理
2023-04-13 04:53:00

C++ Memory management
我在大学里了解到,您始终必须释放未使用的对象,但实际上并不需要释放它们。 例如,正确构造代码等。 我目前不允许使用Boost。 我必须坚持使用纯c ++,因为我使用的框架禁止使用任何泛型。 我使用的是嵌入式Symbian OS,它完全基于开发人员约定而拥有出色的系统。 基本上,如果一个类仅使用某些东西,它将使用引用。如果一个类拥有某些东西,它将使用一个指针。 效果很好,使用起来很愉快。内存问题非常罕见。 规则: 智能指针。 Boost有一些 好的。 不能使用智能指针,将其清空 删除后的指针。 如果有人禁止规则1,请记住,如果您抓住别人的代码,更改变量名称并删除版权声明,则没人会注意到。除非这是一个学校项目,否则他们实际上会使用非常复杂的工具检查这种恶作剧。另请参阅此问题。 我会在这里添加另一个规则:
我们发现,对于C ++不熟悉的程序员或来自Java之类的程序员,似乎是在学习新知识的,然后在不论上下文如何都想创建任何对象的时候迷恋它。当纯粹在函数中本地创建对象以执行有用的操作时,这尤其有害。以这种方式使用new会对性能造成不利影响,并且在忘记相应的删除操作时,很容易造成愚蠢的内存泄漏。是的,智能指针可以帮助后者,但不能解决性能问题(假设在幕后使用了new / delete或等效项)。有趣的是(也许),我们发现使用Visual C ++时,删除往往比新的要昂贵。 这种混乱的某些原因还在于,它们调用的函数可能将指针甚至智能指针作为参数(当引用可能会更好/更清晰时)。这使他们认为他们需要"创建"一个指针(很多人似乎认为这是new所做的事情)才能将指针传递给函数。显然,这需要一些有关如何编写API的规则,以使调用约定尽可能明确,并通过函数原型提供的清晰注释加以增强。 通常,除非必须这样做,否则避免从堆中进行分配。如果必须的话,可以将引用计数用于寿命长的对象,并且需要在代码的不同部分之间共享。 有时您需要动态分配对象,但是它们只会在一定时间范围内使用。例如,在上一个项目中,我需要创建数据库模式的复杂内存表示形式-基本上是对象的复杂循环图。但是,仅在数据库连接期间才需要该图,然后可以一次释放所有节点。在这种情况下,我称之为"本地GC习惯用法"的一种好模式。我不确定它是否具有"正式"名称,因为这是我只在自己的代码和Cocoa中看到的(请参阅Apple Cocoa参考中的NSAutoreleasePool)。 简而言之,您将创建一个"收集器"对象,该对象保留指向使用new分配的临时对象的指针。它通常与程序中的某个范围相关联,例如静态范围(例如,作为实现RAII习惯的堆栈分配对象)或动态范围(例如,与数据库连接的生存期相关)。我以前的项目)。释放"收集器"对象后,其析构函数将释放它指向的所有对象。 另外,像DrPizza一样,我认为不使用模板的限制也很严格。但是,在Solaris,AIX和HP-UX的较旧版本上进行了大量开发(就在最近-是的,这些平台在《财富》 50强中仍然存在),我可以告诉您,如果您真的关心可移植性,应该尽可能少地使用模板。不过,将它们用于容器和智能指针应该没问题(对我有用)。没有模板,我描述的技术将很难实施。它将要求"收集器"管理的所有对象都源自一个公共基类。 在一般情况下(资源管理,其中资源不一定是内存),您需要熟悉RAII模式。这是C ++开发人员最重要的信息之一。 G'day, 我建议阅读Scott Meyers的"有效C ++"的相关部分。易于阅读,并且他介绍了一些有趣的陷阱以诱使那些疏忽的人。 缺少模板也让我着迷。因此,没有STL或Boost。哇。 顺便说一句,让人们就公约达成共识是一个好主意。就像使所有人都同意OOD的约定一样。顺便说一句,最新版的Effective C ++没有第一版中关于OOD约定的出色章节,这很可惜,例如诸如公共虚拟继承之类的约定始终为" isa"关系建模。 抢 您可以从实现智能指针之类的功能的某些基类派生所有内容(使用ref()/ unref()方法和计数器。 @Timbo突出显示的所有点在设计该基类时都很重要。
|
最新内容
相关内容
python的单元测试框架
python的单元测试框架,代码,生态,信息,标准,测试,分析,工具,环境,条款,活跃,1、AutotestAutotest是Google、Redhat、IBM公司联合开发的分布式Web开发人员推荐的Python框架
Web开发人员推荐的Python框架,系统,公司,灵活,时间,项目,软件,框架,认证,管理,异常,您可以在没有框架的情况下创建出色的应用程序。如果您正Python元类之通过元类实现数据库OR
Python元类之通过元类实现数据库ORM框架,数据,名称,信息,代码,主体,当中,字段,分析,一致,投入,ORM框架是什么如果是没有做过后端的小伙伴上来列举Python面向对象中带双下划线的
列举Python面向对象中带双下划线的特殊方法,信息,代码,培训,对象,属性,方法,实例,字符串,里边,内容,__new__:生成实例__init__:生成实例的属性_Python面向对象的基本概念
Python面向对象的基本概念,概念,信息,位置,新增,培训,属性,鸟类,定义,对象,方法,python使用类(class)和对象(object),进行面向对象(object-oriPython 条件对象
Python 条件对象,状态,培训,对象,条件,线程,方法,底层,发生,场景,典型,条件对象总是与某种类型的锁对象相关联,锁对象可以通过传入获得,或者在Python 事件对象
Python 事件对象,通信,培训,线程,事件,对象,内部,标志,信号,机制,以上,一个线程发出事件信号,其他线程等待该信号,这是最简单的线程之间通信机Python之什么是面向对象?
Python之什么是面向对象?,设计,流程,代码,个体,大唐,对比,培训,模子,上帝,对象,OOP(ObjectOrientedPrograming)编程是利用“类”和“对象”来4种出色的Python测试框架!
4种出色的Python测试框架!,项目,代码,测试,标准,扩大,规模,企业,培训,设计,名称,企业软件需要测试,如同建筑物需要消防和安全检查。如果你知道Python如何创建对象,有哪些方法
Python如何创建对象,有哪些方法,培训,对象,方法,内容,函数,属性,所在,以上,以下,功能,以下介绍Python创建对象的9种方法。classPoint:def__inipython类对象和实例对象是一样的吗
python类对象和实例对象是一样的吗,地址,概念,下来,数据,培训,实例,对象,方法,属性,变量,python面向对象最重要的概念就是类(Class)和实例(Inpython中类对象和方法的区别是什么
python中类对象和方法的区别是什么,地址,数据,培训,对象,函数,类型,字符串,方法,表示,身份,python使用对象模型来存储数据,也就是说构造任何类