令一個類展示相似於指針行爲的最好方法是使用shared_ptr來管理類中的資源。this
拷貝(賦值)一個shared_ptr會拷貝(賦值)shared_ptr所指向的指針(能夠認爲shared_ptr有一個引用計數器);當沒有用戶使用對象時,shared_ptr類本身會釋放資源。智能指針比普通指針的好處主要有2點:一、不須要本身手動delete 二、避免delete掉一個還有指針引用的內存(正確的時間釋放內存)spa
解決思路:設計
那麼如何設計本身的類,使其行爲像智能指針呢,使用引用計數就能夠實現,將計數器保存在動態內存中,建立一個對象時,分配一個新計數器,拷貝(賦值)對象時,拷貝指向這個計數器的內存,這樣副本和原對象都指向相同的計數器。指針
h文件調試
#pragma once #include <string> using namespace std; class HasPtr { public: HasPtr(const string &s); HasPtr(const HasPtr&); HasPtr& operator=(const HasPtr &rhs); ~HasPtr(); private: size_t *use; string *pString; };
cpp文件code
#include "stdafx.h" #include "HasPtr.h" #include <string> HasPtr::HasPtr(const string &s=string()):pString(new string(s)),use(new size_t(1)) { } HasPtr::HasPtr(const HasPtr &p) { pString = p.pString; use = p.use; ++*use; } HasPtr& HasPtr::operator=(const HasPtr &rhs) { ++*rhs.use;//防止本身拷貝本身出錯 if (--*use == 0) { delete pString; delete use; } pString = rhs.pString; use = rhs.use; return *this; } HasPtr::~HasPtr() { if (--*use == 0) { delete pString; delete use; } }
main.cpp對象
#include "stdafx.h" #include "HasPtr.h" int main() { HasPtr p1("come here"); HasPtr p2(p1);//拷貝構造 HasPtr p3 = p2;//拷貝構造 p3 = p2;//拷貝賦值 return 0; }
拷貝構造出如今一個初始化和一個未初始化的變量裏,blog
拷貝賦值出如今2個已經初始化的變量裏;內存
拷貝賦值運算符爲何會返回一個指向其左側運算對象的引用?資源
答:一、與內置類型的賦值保持一致
二、標準庫要求保存在容器的類型要具備賦值運算符,且其返回值時左側運算對象的引用
eg: a=b=c;若是沒有返回值,就會出錯
經過斷點一步步調試就會發現每一步的運行步驟