先來看看以下這種場景
我們在fun()裡通過動態記憶體開闢了空間,而當我們在delete 前面由於一些必要的原因必須要丟擲乙個異常時,delete會由於丟擲異常後函式提前終止而沒有被執行,從而導致記憶體洩漏。在這種情況下,我們需要一種能夠在出作用域時自動釋放記憶體空間的指標,從而使我們能夠避免出現記憶體洩漏的情況,為此我們引入了智慧型指標。然而智慧型指標不是指標,它是乙個類,但它能夠做指標能做的事情,並且能夠通過物件生命週期結束時能夠自動呼叫類的析構函式而達到自動釋放記憶體空間的效果。void fun()
void test1()
catch (...)
}
我們主要介紹三種智慧型指標:
auto_ptr通過「許可權轉移"使得不同指標指向的同一塊空間不會被析構兩次,所謂的「許可權轉移發生在拷貝建構函式和賦值運算子過載函式當中。
template
class auto_ptr //許可權轉換
auto_ptr(auto_ptr& _ap) //拷貝建構函式
_ap.m_ptr = null;
}auto_ptr& operator=(auto_ptr& _ap)
m_ptr = _ap.m_ptr;
_ap.m_ptr = null;
return *this;
}void show()
~auto_ptr()
}t* operator->() const
public:
t *m_ptr;
};template
class scope_ptr //不允許賦值
~scope_ptr()
}t* operator->()
private:
scope_ptr(const scope_ptr& _ptr);
scope_ptr& operator=(const scope_ptr& _ptr);
private:
t* m_ptr;
};
scoped_ptr和auto_ptr很相似,都是不允許同乙個位址空間被兩個或多個不同的指標所指向,但是scoped_ptr將這個工作做得更加徹底,他是不允許拷貝建構函式和賦值運算子過載函式發生呼叫。
template
class scope_ptr //不允許賦值
~scope_ptr()
}t* operator->()
private:
scope_ptr(const scope_ptr& _ptr);
scope_ptr& operator=(const scope_ptr& _ptr);
private:
t* m_ptr;
};
shared_ptr則顯得稍微高階一點,它允許兩個指標指向同一塊記憶體位址空間,但是shared_ptr這個類採用了引用計數的方式來維護多個指標指向同一塊記憶體位址空間的問題,它在類中定義了乙個指向計數器pcount的指標,當用乙個物件建立另乙個物件時pcount所指向的計數器值會加1,而在析構函式裡,每進來一次析構函式pcount指標所指向的計數器會減1,只有當計數器中的值為0才會釋放記憶體空間。
template
class shared_ptr //寫時拷貝技術
shared_ptr(const shared_ptr& _sp)
:m_ptr(_sp.m_ptr)
shared_ptr& operator=(shared_ptr& _sp)
m_ptr = _sp.m_ptr;
m_pcount = _sp.m_pcount;
++(*m_pcount);
}return *this;
}t* operator->()
shared_ptr& operator*()
int get_count()
t* get()
~shared_ptr()
}private:
t* m_ptr;
int* m_pcount;
};
c 智慧型指標
auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...
c 智慧型指標
很久沒寫部落格了,不知道如何表達了,哈哈.我先介紹一下深淺拷貝.class copy 此時a.ptr和b.ptr指向同乙個物件,當我們delete a.ptr時 b.ptr所指向的物件已經不存在了,要是我們引用b.ptr指向的物件也就會出問題了.深拷貝 把a.ptr所指向的物件拷貝乙份給b.ptr ...
c 智慧型指標
記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...