《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()时,一定要想清楚,你复制过去的是值还是指针,这很重要!
- 《GeekBand》c++面向对象高级编程02
- C++面向对象高级编程笔记02--GeekBand
- C++面向对象高级编程(上)-Geekband
- 《GeekBand》c++面向对象高级编程01
- 《GeekBand》c++面向对象高级编程03
- 《GeekBand》c++面向对象高级编程04
- C++面向对象高级编程笔记01--GeekBand
- C++面向对象高级编程(下)-Geekband
- C++面向对象高级编程笔记03--GeekBand
- C++面向对象高级编程(下)第一周-Geekband
- C++面向对象高级编程(下)第二周-Geekband
- GeekBand C++面向对象高级编程(上)一
- Geekband C++面向对象高级编程(上) 第一周笔记 暗影行者
- C++面向对象高级编程 GeekBand(图片均引用自课程PDF)
- Geekband C++面向对象高级编程(上) 第二周笔记 暗影行者
- Geekband C++面向对象高级编程(上) 第三周笔记 暗影行者
- Geekband C++面向对象高级编程(下) 第一周笔记 暗影行者
- Geekband C++面向对象高级编程(下) 第二周笔记 暗影行者
- poj 3368 Frequent values (RMQ或线段树)
- 多种CSMA策略的比较
- lua源码的研究入门之makefile
- iOS 常用的第三方库
- Label--自定义可调整内边距的Label
- 《GeekBand》c++面向对象高级编程02
- 谨以此文献给所有对目前工作不满意的宝宝们!
- BZOJ 1853: [Scoi2010]幸运数字
- 将x6cms移植到Codeigniter 3.0框架
- Codeforces 327C 乘法逆元 + 费马小定理 || 等比数列二分求和取模
- Struts2初级知识点
- poj1062 昂贵的聘礼
- nohup-真正的Shell后台运行
- SpringMVC注解@RequestParam全面解析