7、共享内存
1) 原理
- 它允许多个不相关的进程去访问同一部分逻辑内存
- 两个运行中的进程之间传输数据,共享内存将是一种效率极高的解决方案
- 两个运行中的进程共享数据,是进程间通信的高效方法,可有效减少数据拷贝的次数
2) shm 接口
- shmget 创建共享内存
- shmat 启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间
- shmdt 将共享内存从当前进程中分离
1、C 内存泄露
- 在类的构造函数和析构函数中没有匹配地调用 new 和 delete 函数
- 没有正确地清除嵌套的对象指针
- 没有将基类的析构函数定义为虚函数
- 当基类的指针指向子类对象时,如果基类的析构函数不是 virtual,那么子类的析构函数将不会被调用,子类的资源没有得到正确释放,因此造成内存泄露
- 缺少拷贝构造函数,按值传递会调用(拷贝)构造函数,引用传递不会调用
- 指向对象的指针数组不等同于对象数组,数组中存放的是指向对象的指针,不仅要释放每个对象的空间,还要释放每个指针的空间
- 缺少重载赋值运算符,也是逐个成员拷贝的方式复制对象,如果这个类的大小是可变的,那么结果就是造成内存泄露
2、C 野指针
- 指针变量没有初始化
- 指针被 free 或 delete 后,没有设置为 NULL
- 指针操作超越了变量的作用范围,比如返回指向栈内存的指针就是野指针
- 访问空指针(需要做空判断)
- sizeof 无法获取数组的大小
- 试图修改常量,如:char p="1234";p='1';
3、C 资源访问冲突
- 多线程共享变量没有用 valotile 修饰
- 多线程访问全局变量未加锁
- 全局变量仅对单进程有效
- 多进程写共享内存数据,未做同步处理
- mmap 内存映射,多进程不安全
4、STL 迭代器失效
- 被删除的迭代器失效
- 添加元素(insert/push_back 等)、删除元素导致顺序容器迭代器失效
错误示例:删除当前迭代器,迭代器会失效
正确示例:迭代器 erase 时,需保存下一个迭代器
5、C 11 智能指针
- auto_ptr 替换为 unique_ptr
- 使用 make_shared 初始化一个 shared_ptr