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...