c++内存管理方式

概述

  本章总结一些关于我的对内存管理的理解,主要包括以下内容:c++

内存管理原则

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

  这个原则看似你们都赞成,毕竟只有申请内存的人,才知道何时该释放内存。spa

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

优秀的接口

  接口设计者作对了,但不必定是作好了,或者说,接口设计者不必定作得够好了。指针

  在咱们评论接口设计者作得是否“够好了”以前,咱们首先得确立一个简单评价的标准。c++11

  按照我的观察(并不是首创想法),通俗总结,一个好的接口设计有以下特色:code

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

按照以上标准看,做为接口使用者的咱们来看,接口设计者彷佛的确作得不够好,由于他老是把容易出错的部分交给接口使用者来完善,增长了接口使用者设计上的难度。不知足以上标准的第二、3点。对象

智能指针的做用在哪里?

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

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

  智能指针的做用在于能自动释放指针,减小人为使用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()
    {
    }
};

 

联系做者

相关文章
相关标签/搜索