C++编程中常见的线程和内存问题
2017-11-01 18:31
162 查看
最近在梳理一些的知识,这儿汇总一下C++中经常遇到的线程和内存问题,以便后续注意。
避免多线程读写的数据不加锁保护
避免相互调用的函数加成同一把锁造成死锁
全局变量和局部变量初始值为0,而局部变量和动态申请的变量,初始值随机。如果程序使用了随机值的变量,那么程序结果也就可能莫名其妙。
● 非法指针
包括空指针或随意使用指针转换
● 内存读写越界
内存越界是指访问了没有权限访问的内存地址空间。比如对访问数组时越界、对动态内存访问超出申请内存大小等。
● 内存覆盖
C和C++强大之处就是可以直接操作内存,但是一旦内存区域发生重叠,就会导致程序发生不可预期的结果。
● 动态内存管理错误
内存分配方式:静态存储、栈上内存、堆上分配
○ 申请和释放不一致
比如用new申请的,用free释放
○ 申请和释放不匹配
申请了多少内存,就要释放多少内存。如果没有释放就是内存泄露,如果释放多次也会发生问题。
○ 释放后仍然读写
动态内存链表中,内存被释放,那就可能分配给其他部分使用,如果内存释放后再访问,就可能覆盖其他部分的内存,从而导致不可预期的错误。
● 内存泄露
是指在程序动态申请的内存,使用完后既没有被释放,又无法被程序其他部分访问。内存泄露是开发大型程序最头痛的问题,关键是要养成良好的编程习惯。
● 堆栈溢出
不要使用大的局部变量(栈大小是固定,比如8M),这样容易造成堆栈溢出,导致莫名其妙的错误。
线程问题:丢失更新、脏读、死锁等
避免多线程使用线程不安全的函数避免多线程读写的数据不加锁保护
避免相互调用的函数加成同一把锁造成死锁
内存问题:覆盖、溢出、非法等
● 使用未初始化的内存全局变量和局部变量初始值为0,而局部变量和动态申请的变量,初始值随机。如果程序使用了随机值的变量,那么程序结果也就可能莫名其妙。
● 非法指针
包括空指针或随意使用指针转换
● 内存读写越界
内存越界是指访问了没有权限访问的内存地址空间。比如对访问数组时越界、对动态内存访问超出申请内存大小等。
● 内存覆盖
C和C++强大之处就是可以直接操作内存,但是一旦内存区域发生重叠,就会导致程序发生不可预期的结果。
● 动态内存管理错误
内存分配方式:静态存储、栈上内存、堆上分配
○ 申请和释放不一致
比如用new申请的,用free释放
○ 申请和释放不匹配
申请了多少内存,就要释放多少内存。如果没有释放就是内存泄露,如果释放多次也会发生问题。
○ 释放后仍然读写
动态内存链表中,内存被释放,那就可能分配给其他部分使用,如果内存释放后再访问,就可能覆盖其他部分的内存,从而导致不可预期的错误。
● 内存泄露
是指在程序动态申请的内存,使用完后既没有被释放,又无法被程序其他部分访问。内存泄露是开发大型程序最头痛的问题,关键是要养成良好的编程习惯。
● 堆栈溢出
不要使用大的局部变量(栈大小是固定,比如8M),这样容易造成堆栈溢出,导致莫名其妙的错误。
相关文章推荐
- 面试中常见线程的50个问题
- Linux共享内存常见问题分析
- IOS内存常见问题与内存检查工具
- SQL SERVER 内存分配及常见内存问题(1)——简介
- 电脑内存常见问题处理方法
- java线程阻塞中断和LockSupport的常见问题
- 关于线程的常见问题
- Java常见问题分析(内存溢出、内存泄露、线程阻塞等)
- 电脑内存常见问题处理方法
- 谈谈.NET中常见的内存泄露问题——GC、委托事件和弱引用
- 电脑内存常见问题处理方法
- 线程内存泄露问题
- iOS平台内存常见问题
- 一个常见的android内存泄露 问题
- Android内存问题及常见优化
- 使用Memcheck发现常见的内存问题
- Java线程安全问题,方法及内存模型
- 常见的线程问题
- 常见线程问题