C++编程中常见的线程和内存问题

来源:互联网 发布:php查询降序排序 编辑:程序博客网 时间:2024/06/04 23:21

最近在梳理一些的知识,这儿汇总一下C++中经常遇到的线程和内存问题,以便后续注意。

线程问题:丢失更新、脏读、死锁等

  • 避免多线程使用线程不安全的函数
  • 避免多线程读写的数据不加锁保护
  • 避免相互调用的函数加成同一把锁造成死锁

内存问题:覆盖、溢出、非法等

● 使用未初始化的内存
全局变量和局部变量初始值为0,而局部变量和动态申请的变量,初始值随机。如果程序使用了随机值的变量,那么程序结果也就可能莫名其妙。

● 非法指针
包括空指针或随意使用指针转换

● 内存读写越界
内存越界是指访问了没有权限访问的内存地址空间。比如对访问数组时越界、对动态内存访问超出申请内存大小等。

● 内存覆盖
C和C++强大之处就是可以直接操作内存,但是一旦内存区域发生重叠,就会导致程序发生不可预期的结果。

● 动态内存管理错误
内存分配方式:静态存储、栈上内存、堆上分配
○ 申请和释放不一致
比如用new申请的,用free释放
○ 申请和释放不匹配
申请了多少内存,就要释放多少内存。如果没有释放就是内存泄露,如果释放多次也会发生问题。
○ 释放后仍然读写
动态内存链表中,内存被释放,那就可能分配给其他部分使用,如果内存释放后再访问,就可能覆盖其他部分的内存,从而导致不可预期的错误。

● 内存泄露
是指在程序动态申请的内存,使用完后既没有被释放,又无法被程序其他部分访问。内存泄露是开发大型程序最头痛的问题,关键是要养成良好的编程习惯。

● 堆栈溢出
不要使用大的局部变量(栈大小是固定,比如8M),这样容易造成堆栈溢出,导致莫名其妙的错误。

原创粉丝点击