《GeekBand》c++面向对象高级编程02

来源:互联网 发布:怎么在淘宝买东西便宜 编辑:程序博客网 时间:2024/06/06 13:47

这篇笔记主要是记录我在以前学习c++面向对象编程中疏忽的东西。

1.拷贝赋值函数中对自我赋值的检测及处理

在以前的学习中,完全忽略了对自我赋值的检测。因为在日常使用中,正常来说不会发生自己给自己赋值的情况,但是考虑到c++有别名的用法,还是可能会发生这样的事情。

inlineString& String::operator=(const String& str){   if (this == &str)         //self assignment      return *this;   delete[] m_data;   m_data = new char[ strlen(str.m_data) + 1 ];   strcpy(m_data, str.m_data);   return *this;}


引入以上判断来对自我赋值操作检测。防止程序下文操作出现异常;

当然也不是没有其他的解决办法,比如用一个临时中间变量来存第二操作数,但是这样效率就会降低。


2. object 的生存周期

对于对象的生存周期相对来说是比较简单易懂的,很容易被忽视,但是对生存周期的把握是非常重要的,一旦使用不当,轻则降低程序效率,浪费运行内存;重则发生内存泄露,程序运行错误。


首先引用geekband课件上的一张关于栈内存和堆内存的定义


2.1 stack objects 的生命周期

stack objects 一般指的是局部变量或者对象,在其作用域结束的时候就会被系统自动释放掉。

2.2 static local objects 的生命周期

static objects一般指的是静态变量或者对象,在其作用域结束的时候仍然存在,在程序结束的时候被系统自动释放。

2.3 global objects 的生命周期

global objects一般指的是全局变量或者对象,其作用域是整个程序,在程序结束的时候被系统自动释放。

2.4 heap objects 的生命周期

堆内存是在使用new或者malloc是由程序向系统申请的内存空间,需要在其作用域结束的时候由程序主动释放。如果不主动释放,在程序结束时,系统可能不会自动释放,就会造成内存的泄露。


2.1-2.3的变量都是由系统主动释放的,我们在使用的时候主要从效率出发考虑,能用局部变量的就不用全局、静态变量。

2.4堆内存的使用则要非常的慎重。new或者malloc和delete一定要成对出现。array new一定要搭配array delete。

下面说一种典型的内存泄露:

class string{};...{string *str =new string("abc");}

在这个块结束时,str作为局部变量被系统自动释放掉,而由它指向的一个string属于2.4情况的堆内存,不会被自动释放,这个时候就相当于找不到“abc”这个string了,没法使用也没法释放,造成了内存的泄露。


关于内存,有比较常用的两个函数memset(),memcpy(),在使用memcpy()时,一定要想清楚,你复制过去的是值还是指针,这很重要!



0 0
原创粉丝点击