C 智慧型指標之shared ptr

2021-08-19 07:16:07 字數 1768 閱讀 6160

shared_ptr 是為了解決 auto_ptr 在物件所有權上的侷限性(auto_ptr 是獨佔的), 在使用引用計數的機制上提供了可以共享所有權的智慧型指標, 當然這需要額外的開銷:

(1) shared_ptr 物件除了包括乙個所擁有物件的指標外, 還必須包括乙個引用計數**物件的指標。

(2) 時間上的開銷主要在初始化和拷貝操作上, *和->操作符過載的開銷跟auto_ptr是一樣。

(3) 開銷並不是我們不使用shared_ptr的理由, 永遠不要進行不成熟的優化, 直到效能分析器告訴你這一點。

**實現:

使用單例模式進行shared_ptr的實現

#include using namespace std;

class refmanage

private:

refmanage() :length(0)

{} refmanage(const refmanage& rhs);

public:

void addref(void* ptr)

else

}} void delref(void* ptr)

else

}} }

/* 1.null 0

2.not find -1

3.find refcount

*/ int getref(void* ptr)

int index = find(ptr);

if (index < 0)

else

}private:

int find(void* ptr)

}return -1;

} class node

node()

public:

void* addr;

int refcount;

}; node arr[10];

int length;///有效節點個數 當前要插入的節點下標

static refmanage rm;

};refmanage refmanage::rm;

templateclass shared_ptr

shared_ptr(const shared_ptr& rhs)

:mptr(rhs.mptr)

shared_ptr& operator=(const shared_ptr& rhs)

mptr = rhs.mptr;

addref();

} return *this;

} ~shared_ptr()

mptr = null;

} t* operator->()

t& operator*()

private:

void addref()

void delref()

int getref()

t* mptr;

static refmanage* rm;

};templaterefmanage* shared_ptr::rm = refmanage::getinstance();

class b;

class a

~a()

shared_ptrpa;

};class b

~b()

shared_ptrpb;

};int main()

執行結果:

C 智慧型指標之shared ptr

c 中用new來動態分配記憶體,delete手動釋放記憶體來達到動態管理記憶體的目的。因為保證在正確的時間釋放記憶體是非常困難的,忘記釋放記憶體就會產生記憶體洩露。為了更安全 便捷的使用動態記憶體,c 11標準庫提供了新的智慧型指標類來管理動態記憶體。智慧型指標在行為上和普通的指標是一樣的,只不過它...

智慧型指標之shared ptr

在智慧型指標中,auto ptr已經使用的越來越少了,特別是在c 11中,它已經被shared ptr取代,原因主要有以下兩點 1.auto ptr不能保留指標所有權 class test test public int m test void fun auto ptrp1 void main 上述...

c 智慧型指標 shared ptr

為了更容易更方便的使用動態記憶體,c 提供了兩種智慧型指標shared ptr和unique ptr來管理動態物件,智慧型指標負責自動釋放所管理的物件,避免因為不合適的釋放導致的記憶體洩露和訪問已釋放記憶體的bug 智慧型指標也是模板,建立乙個智慧型指標時,必須提供額外的型別資訊,如shared p...