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()
    {
    }
};

 

聯繫做者

相關文章
相關標籤/搜索