C++中可能出现的内存问题和解决方法

C++中可能出现的内存问题和解决方法分为以下6个方面,我们一个一个谈,给出相应的解决方法。

  1. 缓冲区有溢出问题

我们可以字节编写一个buffer class,它的作用类似于标准库中的string类,让其记住缓冲区长度,通过成员函数而不是裸指针来修改缓冲区。

  1. 空悬指针和野指针

空悬指针指的是该指针指向的变量内存已经被释放,野指针指的是没有进行初始化的指针。这种指针带来的问题往往都是没有进行适时的析构和初始化引起的,我们可以直接使用智能指针shared_ptr/weak_ptr来解决这个问题。对智能指针不了解的同学可以看一下智能指针这一篇文章。

  1. 重复释放

重复释放顾名思义就是指在释放内存之后再次释放,这种情乱建议使用scoped_ptr指针,这种指针在上文提及的博文中没有进行详细介绍,我们简要说一下这种指针的特点。
scoped_ptr时boost库中的特有的,从功能上来说它和智能指针博文中的unique_ptr基本相同,都是不允许转让管理权。也就是说,scoped_ptr 禁止用户进行拷贝与赋值(除了使用 reset 成员函数重置内部指针所指的对象,又或者使用 swap 成员函数交换指针的所指的对象)。它能够保证在离开作用域后对象被自动释放。

  1. 内存泄漏

内存泄露是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等后果。这种也是由于无法进行正确的析构引起的问题,所以也是可以通过智能指针scoped_ptr来解决的。

  1. 不配对的new[]、delete

就是指在程序员申请多个相同类型的数据的内存时,释放时却没有全部释放,正确的释放应该是delete[],这种情况和上文中的问题很相似,可以使用智能指针来解决,因为是多数据的,所以建议使用vector或者scoped_array(前者是std标准库中一种变长数组,后者可以认为是scoped_ptr的数组形式)。

  1. 内存碎片

这个问题相对而言就不是这么好解决了,内存碎片可以分为内部碎片和外部碎片,内部碎片指的是由于内存对齐引起的,外部碎片往往是由于内存的不断分配和释放导致一些小内存分散在内存各处,无法被用以分配。前者特别是对于结构体而言,程序员可以通过调整变量定义的顺序来尽量的降低,后者就是系统的内存管理算法的相关问题了,感兴趣的读者可以深入了解一下。


以上这些问题中,内存泄漏相对危害较小,因为它只是借了东西不还,程序在一段时间内时正常的,其他问题可能会造成系统安全性方面的严重后果。

以上是本人阅读陈硕老师muduo这本书后的总结和笔记。

你可能感兴趣的