您的位置:首页 > 其它

指针(2)指针常见问题(re迭代)

2013-12-28 01:03 148 查看
what 空悬指针(dangling pointer):指向已经销毁的对象或已回收的地址(《Linux多线程服务端编程》p7)
what 野指针(wild pointer):未经初始化的指针

《Linux多线程服务端编程》p15
which
内存问题(C++里可能出现的内存问题)
1)缓冲区溢出(buffer overrun)
2)空悬指针/野指针
3)重复释放(double delete)
4)内存泄露(memory leak)
5)不配对的new[]/delete
6)内存碎片(memory fragmentation)
7)父类指针delete子类对象,而该父类的析构函数是non-virtual。结果未定义,实际执行时通常发生的是,对象的子类部分没被销毁(《effective c++ 》p71 item7)
how对策
1)空悬指针/野指针用shared_ptr/weak_ptr
2)重复释放 用scoped_ptr,只在对象析构的时候释放一次

when 空悬指针/野指针!造成后果非法访问】(《高质量程序设计指南c语言(第三版)林锐》 p310)
1)没有初始化指针变量【how对策:1)定义立即初始化 2)不要忘记初始化指针,数组,动态内存】
2)指针变量被free()或者delete之后,没有置为NULL【how对策:delete或free()之后,立即置为NULL;即便delete之后立即用new赋新值,也要先在delete之后赋NULL,因为考虑到异常安全的问题,见《effective c++》Item29(或者更好的是,先new再delete,new之后指针交换再delete)。】
3)指针操作超越了变量的作用范围 【how对策:不要让指针指向堆栈变量;要指向堆栈变量,也要保证定义和使用都在一个作用域;如果定义在作用域外,也要在一出作用域的范围外,置为NULL】
4)函数return返回“堆栈内存”(即,局部对象)的指针或引用.若返回的局部对象为static则可以,参考singleton模式
5)数组越界和指针越界(比如用指针进行算术操作时)(特别是在循环中)

when 内存泄露 (《高质量程序设计指南c语言(第三版)林锐》p305)
1.忘记了释放内存,或只释放了部分内存(a)new []内存却delete而没有delete[] b)比如你使用了错误的动态数组释放语法)
2.指针变量赋值操作:指针变量未delete或free()之后,又赋新值
3.控制流提前跳过delete语句:意外修改造成的问题,有几种可能性(参考智能指针的引入)
4.类类型对象在构造函数中抛出异常,而构造函数中在抛出异常的语句之前有分配过资源(包括内存)

where 内存分配位置
1)静态存储区(static memory):《c++ primer英文版 第5版》p562 《高质量程序设计指南c语言(第三版)林锐》p304
局部静态变量,类静态成员变量,函数外定义的变量(gloable作用域,file作用域,namespace作用域)
2)堆栈(statck memory)
3)堆(即自由存储区 heap or free store)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: