設計一個行爲像智能指針的類

令一個類展示相似於指針行爲的最好方法是使用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;若是沒有返回值,就會出錯

 

 

經過斷點一步步調試就會發現每一步的運行步驟

相關文章
相關標籤/搜索