概述

  本章总结一些关于个人对内存管理的理解,主要包括如下内容:

内存管理原则

  学c++的同学都知道这个内存管理原则,就是“谁创建,谁释放”或者说“谁申请,谁释放”。简单地说,在代码上体现为,调用new或malloc等内存分配的人,同时需在内存使用完成后调用delete或free释放。

  这个原则看似大家都同意,毕竟只有申请内存的人,才知道什么时候该释放内存。

  这无疑是一个正确的原则,但这个原则在任意场景中是否都合理呢,不见得。按照这个原则,作为一个接口提供者,要保证自己没有内存问题,其实很简单,接口提供者只需把内存申请和释放的工作都交给接口使用者就可以了。这看似很完美,我不创建,就不需要释放,也就不存在内存漏洞的问题,如果系统有内存泄露的问题,那肯定是接口使用者的责任。不知道真相的使用者只能“满眼泪光”地回去调逻辑,知道真相的使用者也只能无辜地回去调代码。

优秀的接口

  接口设计者做对了,但不一定是做好了,或者说,接口设计者不一定做得够好了。

  在我们评论接口设计者做得是否“够好了”之前,我们首先得确立一个简单评价的标准。

  按照个人观察(并非独创想法),通俗总结,一个好的接口设计有如下特点:

  1. 满足使用者功能要求(当然是基础);
  2. 接口友好,容易理解和使用;
  3. 容易被正确使用(第二点的延伸);
  4. ……

按照以上标准看,作为接口使用者的我们来看,接口设计者似乎的确做得不够好,因为他总是把容易出错的部分交给接口使用者来完善,增加了接口使用者设计上的难度。不满足以上标准的第2、3点。

智能指针的作用在哪里?

  OK,我们终于涉及智能指针了,在这里我们不打算讲智能指针的实现原理,这部分网上有很多可以参考的文章,另外,这部分也不需要大家去实现,现在c++11已经有标准的智能指针形式std:share_ptr,这意味着你想使用智能指针,是一件非常容易的事情。

  使用智能指针,能让接口设计者做得更好:

  智能指针的作用在于能自动释放指针,减少人为使用new和delete所存在的内存问题。接口设计者可以运用智能指针,把申请内存的工作都在接口内部实现并加以限制,把释放内存的工作交给智能指针。

  常见的形式如下代码,接口提供者提供私有构造函数类,禁止外部直接创建,而接口使用者可以通过使用类的CreateInstance获得一个Test类对象。

  这样,接口使用者不需要在关注内存释放问题。根据如下代码的形式,我们总结下只能指针的优点:

  1. 由于CreateInstance返回一个Test类型的智能指针对象,由智能指针负责释放。
  2. 接口使用者没有直接调用new申请内存故也无需调用delete释放。
  3. 接口设计设把类构造函数设为私有(我们在此不考虑这样做的拓展性方面的影响),限制外面使用new创建,接口友好度提高,而且更加容易被正确使用。
class Test
{
public:
typedef std::shared_ptr<Test> TestPtr
static TestPtr CreateInstance()
{
return new Test();
}
private:
Test()
{
}
};

联系作者

c++内存管理方式的更多相关文章

  1. glusterfs 内存管理方式

    glusterfs中的内存管理方式: 首先来看看glusterfs的内存管理结构吧: struct mem_pool { struct list_head list; int hot_count; i ...

  2. 24小时学通Linux内核之内存管理方式

    昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今天将会讲诉Linux如何追踪和管理用户空间进程的可用内 ...

  3. windows内存管理方式以及优缺点

    Windows内存管理方式:页式管理,段式管理,段页式管理 页式管理 将各进程的虚拟空间(逻辑地址)划分为若干个长度相等的页,业内管理把内存空间(物理内存)按照页的大小划分为片或者页面,从而实现了离散 ...

  4. 十天学Linux内核之第三天---内存管理方式

    原文:十天学Linux内核之第三天---内存管理方式 昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今 ...

  5. ObjC如何通过runtime修改Ivar的内存管理方式

    ObjC如何通过runtime修改Ivar的内存管理方式 为什么要这么做? 在iOS 9之前,UITableView(或者更确切的说是 UIScrollView)有一个众所周知的问题: propert ...

  6. 这篇关于Oracle内存管理方式的介绍太棒了!我必须要转发,很全面。哈哈~

    "Oracle内存管理可分为两大类,自动内存管理和手动内存管理.其中手动内存管理又可分为自动共享内存管理,手动共享内存管理,自动PGA内存管理以及手动PGA内存管理.本文会简单的介绍不同的内 ...

  7. (笔记)Linux内核学习(九)之内核内存管理方式

    一 页 内核把物理页作为内存管理的基本单位:内存管理单元(MMU)把虚拟地址转换为物理 地址,通常以页为单位进行处理.MMU以页大小为单位来管理系统中的也表. 32位系统:页大小4KB 64位系统:页 ...

  8. Linux内核学习笔记——内核内存管理方式

    一 页 内核把物理页作为内存管理的基本单位:内存管理单元(MMU)把虚拟地址转换为物理 地址,通常以页为单位进行处理.MMU以页大小为单位来管理系统中的也表. 32位系统:页大小4KB 64位系统:页 ...

  9. glibc内存管理方式

    程序员接触的内存空间和系统接触的物理内存空间是有所区别的.对于一般进程来讲,他面对的是一个线性虚拟内存空间:地址从0到最大值.每一个进程面对的虚拟内存空间都是一样的,都享有全部的内存地址.虚拟内存空间 ...

随机推荐

  1. 趣味编程:24点(Haskell版)

    24 game/Solve import Data.List import Data.Ratio import Control.Monad data Expr = Constant Rational ...

  2. scala -- 传名参数

    object Test{ def main(args: Array[String]): Unit = { def test(code : => Unit){// 传名参数 不计算函数值,而是把函 ...

  3. pyorient

    简介 pyorient是orientdb的python库 该库提供两种访问orientdb的方式:1.client 的方式 2.ogm 的方式(类似于ORM) 由于OGM 封装了client,且由于O ...

  4. 通过Github Pages在线查看百度前端技术学院完成的任务成果

    前言 .note-content {font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHe ...

  5. Windows XP with SP3大客户免激活日文版

    原贴地址:http://www.humin.com.cn/ja_windows_xp_professional_with_service_pack_3_x86_dvd_vl_x14-74058-iso ...

  6. asp.net 关于Response.Redirect重定向前无法弹出alert对话框的问题

    要实现的功能:某项操作后,使用alert()提示框提示"操作成功"之类的提示,然后使用response.Redirect()来进行页面重定向. 出现的问题:运行代码,操作完成后,直 ...

  7. PAT L1-020 帅到没朋友(模拟数组)

    当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友.本题就要求你找出那些帅到没有朋友的人. 输入格式: 输入第一行给出一个正整数N(≤100),是已知朋友圈的个数:随后N行,每行首先给 ...

  8. 240. Search a 2D Matrix II&&74. Search a 2D Matrix 都用不严格递增的方法

    一句话思路:从左下角开始找.复杂度是o(m+n). 一刷报错: 应该是一个while循环中有几个条件判断语句,而不是每个条件判断语句里去加while,很麻烦 数组越界了.从0开始,y的最大条件应该是& ...

  9. mvn 使用

    简介 本文将介绍基于 Apache Maven 3 的项目构建的基本概念和方法.Maven 是一套标准的项目构建和管理工具,使用统一规范的脚本进行项目构建,简单易用,摒弃了 Ant 中繁琐的构建元素, ...

  10. 小X归来 模拟赛1 解析

    Problem1 单峰 小X 归来后,首先对数列很感兴趣.他想起有1类特殊的数列叫单峰数列. 我们说一个数列 {ai} 是单峰的,当且仅当存在一个位置 k 使得 ai < ai+1(i < ...