指针(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)
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)
相关文章推荐
- 常见问题纠错:指针数组和数组指针
- LoadRunner HTTP脚本迭代处理的常见问题
- LoadRunner HTTP脚本迭代处理的常见问题
- VC++ CString 及char 指针的常见问题(转)
- 指针常见问题
- 【面试常见问题】【C++】指针和引用的区别,有哪些不同点,细细道1
- 指针使用中一些常见问题
- 使用指针的常见问题
- C/C++ 指针应用 常见问题
- C常见问题之字符串数组和字符指针数组问题
- 总结了一些指针易出错的常见问题(六)
- IO模式设置网络编程常见问题总结—IO模式设置,阻塞与非阻塞的比较,recv参数对性能的影响—O_NONBLOCK(open使用)、IPC_NOWAIT(msgrcv)、MSG_DONTWAIT(re
- 指针使用常见问题的解答与求教系列(1)
- C常见问题之函数指针
- 总结了一些指针易出错的常见问题(五)
- 总结了一些指针易出错的常见问题(二)
- C常见问题之字符串的数组形式与指针形式的区别
- fragement中的常见问题主要是空指针问题和单击事件无响应问题
- Java实现超市管理系统Class思维模式实现,空指针问题常见处理办法
- 总结了一些指针易出错的常见问题(一)