美文网首页
Boolan C++(上)2

Boolan C++(上)2

作者: rrreal | 来源:发表于2017-04-27 23:05 被阅读0次

    1.BIG THREE 三个特殊函数

    1.1析构函数

    在设计类的时候分配了资源,而这些资源,成员函数又不会自动释放,那么就需要一个析构函数,析构函数在创建的对象消亡的时候会自动被编译器调用。特别是那些构造函数中使用了new表达式的类,通常要在析构函数中加上对应的delete,否则会造成内存泄漏。

    1.2拷贝构造

    带有指针的类必须要自己写拷贝构造函数和拷贝赋值函数,因为如果使用编译器给的默认拷贝构造函数,只是将a的地址拷贝到b中去,并没有拷贝a的m_data指向的那个内容,使得a的m_data和b的m_data指向同一个地方,b的m_data原本指向的“World”就成了一个孤立的内容,这样会造成内存泄漏。而且因为a和b都指向一块内存,更改a就会影响b,也是一个隐患,这个被称为浅拷贝,默认的拷贝属于浅拷贝,只是单纯地一个位一个为把值复制给想赋值的对象。所以要使用深拷贝的方法,即自己写一个拷贝构造函数。

    1.3拷贝赋值

    切记自我赋值检测,如果没有自我赋值检测,delete[] m_data这一步骤会把自己的内容删掉,产生不确定行为。

    2.堆、栈与内存管理

    2.1栈(heap)

    栈为函数内部声明的局部变量提供了存储空间,他的生命在作用域结束之际结束,这些变量就是auto变量。进行函数调用的时候,栈存储与此有关的维护信息,这些性息就是过程活动记录,他包含函数调用的地址(就是调用函数结束后返回的地方),还有一些不适合放到寄存器中的变量的值和寄存器值的保存,调用函数时起到保存现场的作用。栈也被作为临时区使用,比如表达式很长,其中还有几个函数调用,这个时候就会利用栈,把先计算出来的值临时存放,要使用时在拿出来计算。

    2.2堆(stack)

    堆是指由操作系统提供的一块全局内存空间,程序可以手动分配和释放。

    需要注意的是内存泄漏,在作用域结束之前,指针指向的堆的内存依旧存在,如若走出作用域之前未delete,在作用域之外没有机会使用delete,就会造成内存泄漏,切记new和delete一定是成对出现的。

    new的步骤:(1)进行内存分配(使用malloc)(2)转型(3)调用构造函数

    new在创建对象的时候会去调用构造函数之间初始化对象,但是malloc必需手动的赋值。

    delete的步骤:(1)调用析构函数(2)free

    delete在对象被销毁之前,会去调用类内对应的析构函数,这就意味着,可以在对象销毁时做更多的事情,free只是单纯的释放内存。

    3.内存管理

    3.1cookies用来记所分配内存块的大小,大小是16bit的倍数,末位表示输入(0)和输出(1);灰色部分表示debug代码区,不需要调试可以不要;浅绿色表示对象所存在的内存区域;深绿色是为了使分配的内存为16的倍数所填补的,称为pad。

    3.2array new一定要搭配array delete,否则也会造成内存泄漏。

    4.static

    4.1非静态成员变量中,使用者如图创建了三个对象,在内存模型中,每个对象都有一份成员变量,通过this指针(每个对象的地址)来区别是哪个对象调用对应的成员变量。同样的一份成员函数处理多个对象的需求也是通过this指针实现的。

    4.2在成员变量或者成员函数前面加上关键字static,那么就变成静态的成员变量和静态的成员函数,脱离了对象,只有一份。应用比如设计一种银行账户体系,用户的账号是每一个对象,银行的利率和对象无关,这时把利率设计成静态的成员变量。静态成员函数没有this pointer,不能像一般的成员函数一样去访问、处理对象里面的数据,静态函数只能处理静态的数据。静态的数据在class的外头必须要定义,初值可以给也可以不给。

    调用static函数的方式有两种:(1)通过object调用;(2)通过class name调用。

    就写这么多,回头要多看看。

    相关文章

      网友评论

          本文标题:Boolan C++(上)2

          本文链接:https://www.haomeiwen.com/subject/cmanzttx.html