歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C++之我們為什麼選擇使用智能指針

你的內存管理原則是否正確?

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

Copyright © Linux教程網 All Rights Reserved