c++类的内存管理

看了一篇讲c++内存管理的长博,感叹作者的牛逼之余也加点儿梗吧。。。

贴出博客地址:c++内存管理-- oayx大神!http://www.cnblogs.com/lancidie/archive/2011/08/05/2128318.html

tips:在类内,多态基类的析构函数应该为虚函数

根据c++多态特性,当我们的基类指针指向子类对象时,当我们调用基类指针的某个函数为虚函数,则我们调用的是子类的该函数,否则调用基类的该函数。。。

这样说貌似说不清楚,之前写(chao)过一篇讲虚函数的博客,嗯,将就着看看吧...http://blog.csdn.net/wstzone/article/details/39374287

然后,辣就上代码吧。。。

class Employee
{
<span style="white-space:pre">	</span>public:
<span style="white-space:pre">		</span>Employee();
<span style="white-space:pre">		</span>~Employee();
<span style="white-space:pre">		</span>...
};
class Programer : public Employee
{
<span style="white-space:pre">	</span>public:
<span style="white-space:pre">		</span>Programer();
<span style="white-space:pre">		</span>~Programer();
<span style="white-space:pre">		</span>...
};
class Tester : public Employee
{
<span style="white-space:pre">	</span>public:
<span style="white-space:pre">		</span>Tester();
<span style="white-space:pre">		</span>~Tester();
<span style="white-space:pre">		</span>...
};

这个时候假如我们执行

Employee * pEmployee = createEmployee(type);//这里new 一个type对象,type是各个子类
...//
delete pEmployee;//problem shows up

其实我们的想法是美好的,我们new 了一个对象,然后删除了一个对象有木有。。。

但是其实我们new的是子类对象,new调用的是子类对象的构造函数;delete了基类对象,delete调用的却是基类的析构函数!

结果我们就变成了只删除了子类对象中的基类部分,并未完全删除。。。会导致问题你懂的。。。

但是,如果我们把基类的析构函数设置为virtual的虚函数,辣么我们这个流程就变得正确了,c++会正确的调用整个析构链,销毁整个对象。。

即:

class Employee
{
<span style="white-space:pre">	</span>public:
<span style="white-space:pre">		</span>Employee();
<span style="white-space:pre">		</span>virtual ~Employee();
<span style="white-space:pre">		</span>...
};

注意,我们说的是多态基类(这样的类必然会需要包含其他的虚函数才能称得上多态基类吧)这样做是正确的,但当我们的类不包含其他虚函数时,辣就最好别这样做,因为虚函数表会导致类对象大小的增大,并且因为结构的变化也会失去部分可移植性。

另外,不能将构造函数设置为虚构函数。。。这个应该毫无疑问的吧,问一下why:

无论对象在哪里构建,我们new 一个对象的时候做两件事:1.分配一块内存;2调用构造函数

然后其实构造函数要做的事情之一就是初始化类的虚函数表。。如果构造函数是虚函数,辣么我们需要通过虚函数表来调用构造函数,呃,死循环。。。

时间: 2024-11-10 16:04:13

c++类的内存管理的相关文章

黑马程序员---OC基础6【内存管理】【手动内存管理】【单、多个对象的内存管理】【*@property参数】【@class的使用】【NSString类的内存管理】【autorelease使用】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [内存管理] 1.内存管理概念 由于移动设备内存及其有限,所以每个app所占的内存也是有限的 需要回收一些不使用的空间 2.OC内存管理的范围 管理任何继承NSOject的对象,对其他的基本数据类型无效 主要管理堆区中的对象的内存管理   3.内存管理的原理 1)对象所有权概念 任何对象都可以能拥有一个或多个所有者,只要一个对象至少还拥有一个所有者,他就会继续存在 cocoasu所有权策略 任何自

OC5_复合类的内存管理

// // Person.h // OC5_复合类的内存管理 // // Created by zhangxueming on 15/6/18. // Copyright (c) 2015年 zhangxueming. All rights reserved. // #import <Foundation/Foundation.h> @interface Person : NSObject //先release 再 copy @property (copy,nonatomic) NSStrin

Cocos2d之Ref类与内存管理使用详解

一.简介 用C++和JAVA编写过程序的朋友一定会为两种语言不同的内存管理机制懊恼.JAVA程序运行在JVM之上,由JVM自动实现内存管理,开发者只管申请内存而不用手动释放内存.当JAVA中对象没有被任何引用变量(类似于C和C++的指针)引用时,JVM会将对象释放掉.C++和C一样,是编译后能够直接被操作系统执行的语言,没有虚拟机负责其内存管理,因此需要在程序中管理内存.本文主要介绍如何使用cocos2d提供的内存管理机制. Cocos2d-x借鉴了“引用计数”思想,实现了一定程度上的自动内存管

黑马程序员--Objective-C之--OC中的内存管理

对于面向对象的变成语言,程序需要不断地创建对象. 初始,创建的所有程序通常都有指针指向它,程序可能需要访问这些对象的实例变量或调用这些对象的方法,随着程序的不断执行,程序再次创建了一些新的对象, 而那些老的对象已经不会再被调用,也不再有指针指向他们,如果程序没有回收他们占用的内存,就会出现内存泄露. 如果程序一直泄露内存,那么可用内存就会越来越少,直到没有足够的内存,程序將会崩溃.目前,主要有两种管理内存的技术,一是引用计数,二是垃圾回收. iOS平台目前只支持引用计数,Mac平台支持垃圾回收.

Cocos2d之&ldquo;引用计数&rdquo;内存管理机制实现解析

一.引言 本文主要分析cocos2d游戏开发引擎的引用计数内存管理技术的实现原理.建议读者在阅读本文之前阅读笔者之前一篇介绍如何使用cocos2d内存管理技术的文章--<Cocos2d之Ref类与内存管理使用详解>. 二.相关概念 引用计数 引用计数是计算机编程语言的一种内存管理技术,是指将资源(对象.内存或者磁盘空间等)的被引用计数保存起来,当引用计数变为零时就将资源释放的过程.使用引用计数技术可以实现自动内存管理的目的. 当实例化一个类时,对象的引用计数为1,在其他对象需要持有这个对象时,

Cocos2d-x开发中Ref内存管理

Ref类是Cocos2d-x根类,Cocos2d-x中的很多类都派生自它,例如,我们熟悉的节点类Node也派生自Ref.我们介绍Ref内存管理.内存引用计数Ref类设计来源于Cocos2d-iphone的CCObject类,在Cocos2d-x 2.x中也叫CCObject类.因此Ref类的内存管理是参考Objective-C手动管理引用计数(Reference Count)而设计的.如图所示是内存引用计数原理示意图. 每个Ref对象都有一个内部计数器,这个计数器跟踪对象的引用次数,被称为"引用

23-黑马程序员------OC 语言学习笔记---内存管理

黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 对于面向对象的变成语言,程序需要不断地创建对象.初始,创建的所有程序通常都有指针指向它,程序可能需要访问这些对象的实例变量或调用这些对象的方法,随着程序的不断执行,程序再次创建了一些新的对象,而那些老的对象已经不会再被调用,也不

Cocos2d-x学习笔记—内存管理机制

Cocos2d-x 3.x内存管理机制 1:C++内存管理 1-1:内存分配区域 创建对象需要两个步骤:第一步,为对象分配内存:第二步,调用构造函数初始化内存.在第一步中,可以选择几个不同的分配区域.这几个区域如下: (1) 栈区域分配.栈内存分配运算内置于处理器的指令集中,效率很髙,但是分配的内 存容量有限.由处理器自动分配和释放,用来存放函数的参数值和局部变量的值等.在执 行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放. (2) 堆区域分配.从堆上分

内存管理大总结

<link rel="stylesheet" href="http://yandex.st/highlightjs/6.2/styles/googlecode.min.css"> <script src="http://code.jquery.com/jquery-1.7.2.min.js"></script><script src="http://yandex.st/highlightjs/6