C++应该如何管理好我们的内存资源

88 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

  在C++中,内存资源是由我们自己来操纵的,这个给我们带来了非常大的便捷性,可是也给我们带来了不小的麻烦。 麻烦之处就在于,内存管理的正确与否,决定了我们一个程序的健壮性、可用性、稳定性各个方面。

我有一篇文章简单介绍了一下在内存管理中的内存泄漏问题,查看文章

那么,在C++中,我们应该如何管理我们的内存呢?

采用new+delete的方式,和采用malloc+free的管理,又差在什么地方呢?

在我的文章C++ 的 new 和 delete一文中,我介绍了newdelete相对起mallocfree来说的,其实多了一步构造的功能

其实 new 也是通过底层去调用 malloc来分配的,当然,多了一层抽象接口,你就有更多选择了

  你可以通过一块堆上的内存或者一块栈上的内存来分配,也是可以的,只不过,这一块地址可以被重复使用,而 new 起的作用则是构造


智能指针管理内存

  经常的 newdelete 会让我们承受很大的负担,若是可以像GC那个样子自动帮我们清理就好了

  可是GC也意味着需要额外的开销,C++并不想干这一件事情,所以,C++利用他那RAII来帮我们构造一个对象和自动销毁对象,这是一种RAII手法,在rust中也有类似的体现之处,抛开循环引用的问题,智能指针可以帮助我们解决很多问题,而循环引用则需要我们通过一定的手段来消除这个东西。


move资源

  C++的语义是复杂的,从C++11起,又增加了移动语义,若是你不小心踩了一下移动的坑,你可能暂时站不起来,那么,移动意味着所有权的交出,自己不在对对象享有所有权,可是C++中并不去检查你移动完的原来的对象的使用,也许这个使用是合法的,也许是一个段错误,未定义谁知道呢?


频繁分配的内存

  相信你一定不会在程序中进行反复的分配大内存,释放大内存。因为这会导致缺页和效率问题,并且大内存有多少可以频繁分配的呢?

  对于小内存而已,则情况却不一样了,我们可能一个程序反复的执行,需要动态分配内存,导致频繁的分配出一些小内存,这些小内存有时候会导致我们的内存碎片化,严重的可能会影响一些程序的执行的工作。

  这个时候我们就应该考虑使用内存池这种资源了,我们取和放都从一个池子中去拿,事实证明,我们是可以对小内存进行优化的,比如从1字节到128字节不从系统中分配,从我们的对应大小的内存池中去拿取,这样就相当于我们细说了空间,结果却换来的时间