SMART POINTER(智慧指標) (轉)
智慧指標(smart pointer):
智慧指標是其實是一個A,它帶有一個模針成員變數m_p.用該A管理m_p,透過這種管理機制,可以防止由於new而導致的洩漏.
智慧指標物件在使用時像指標一樣.同時也具有一般物件的所有特徵.如果要注意以下幾點:
1,物件之間的賦值:若有A=B,則在賦值時,
首先要松查是否為自身賦值.如果不是,則釋放A物件成員指標的記憶體空間,
然後要將B中的成員指標賦值於A的成員指標,
接著將B中的成員指標置為空,這樣可以避免多個指標同時指向一個記憶體空間而產生多次析構此記憶體空間的錯誤.
所以,過載的賦值一般如下:
operator =(Test& _); 此處不能為const 物件的引用,這是因為要修改source_object 的成員指標為空.
2,對於copy constroctor也有與operator=類似的情況.只不過不要釋放A成員指標的記憶體空間,.
3,關於member template的問題,它往往用於相容模板物件之間的相互賦值,copy constroctor.我們可以將它看成是個模板類(一個類).
譬如:auto_ptr,這就是一個類名稱
另:VC7.0中,成員模板的定義和實現必須放在類的定義中.
注:member template不能為static 或virtual
4,智慧指標中必須過載的幾個運算子: -> *
這樣做的目的就是將物件模仿成指標的行為.
如下:
T* operator ->()
{return m_p;}
特別注意:
object->m_p;== (object.operator->())->m_p;
T& operator *()
{return *m_p;}
下面的演示smart pointer的基本使用:
#include"iostream"
using namespace std;
template
class auto_ptr
{
public:
auto_ptr( T *p=0)
{
m_p=p;
}
//由auto_ptr
auto_ptr(auto_ptr
{
m_p=(T*)( source_object.get());
source_object.m_p=0; //
}
//由auto_ptr
template
auto_ptr(auto_ptr
{
m_p=(T*)( source_object.get());
source_object.m_p=0; //
}
//析構....
~auto_ptr()
{
if (m_p!=0)
Release();
}
//由auto_ptr
auto_ptr
{
Release();
m_p=(T*)(source_object.get());
return *this;
}
//由auto_ptr
template
auto_ptr
{
Release();
m_p=(T*)(source_object.get());
return *this;
}
//delete m_p;
void Release()
{
if (m_p!=0)
delete m_p;
m_p=0;
}
T* get()
{
return m_p;
}
// from auto_ptr
//宣告:1 由於上面提供從auto_ptr
// 2 VC不支援這個隱式轉換特性.
template
operator auto_ptr
//如果M和T型別不一致時,將無法進行自動的型別轉換.如:auto_ptr
{
return auto_ptr
//此處困惑:::
// return auto_ptr
//應該這樣:
//temp auto_ptr
//Release();
//return temp;
}
T* operator ->()
{
return m_p;
}
const T* operator->() const
{
return m_p;
}
//此處注意為T&,這樣可以實現左值.
T& operator *()
{
return *m_p;
}
const T& operator *() const
{
return *m_p;
}
public:
T *m_p;
};
class test
{
public:
test(int data)
{
m_data=data;
}
int& operator->()
{
return m_data;
}
operator int()
{
return m_data;
}
public:
int m_data;
};
class A
{
public:
A(int data)
{
m_data=data;
}
private:
int m_data;
};
class B:public A
{
public:
B(int data):A(data*2),m_data(data)
{
;
}
private:
int m_data;
};
class C:public A
{
public:
C(int data):A(data*3),m_data(data)
{
;
}
private:
int m_data;
};
void test_member_template(const auto_ptr& source_object)
//此處一定要加const,因為物件隱式轉換後生成的物件為臨時物件.臨時物件的生存週期將不由程式設計師決定,其值不能被修改.
{
//source_object.get();
}
void test_member_template2(const auto_ptr
//此處一定要加const,因為物件隱式轉換後生成的物件為臨時物件.臨時物件的生存週期將不由程式設計師決定,其值不能被修改.
{
;
}
void main()
{
auto_ptr
test_member_template(object2);
//將member template constructor 構造出auto_ptr 物件.注意,函式執行後,將導致object2變為為空殼物件.要避免這種隱式的模板物件構造.
auto_ptr auto_ptr auto_ptr object_int_2=object_int; //operator = object_float=object_int; //operator = by member template test_member_template2(object_int); //copy constructor test_member_template2(object_float);//call constructor by member template.
int data=object.operator->()->m_data;
//等價於: data=object.operator->()->operator->();
cout<
//注意,函式執行後,將導致object2變為為空殼物件.要避免這種隱式的模板物件構造.
cout< auto_ptr
//此處呼叫 copy constructor
cout<
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10794571/viewspace-974274/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [CareerCup] 13.8 Smart Pointer 智慧指標指標
- C++深度探索系列:智慧指標(Smart Pointer) [二] (轉)C++指標
- 陣列指標:a pointer to an array,即指向陣列的指標陣列指標
- [CareerCup] 13.7 Node Pointer 節點指標指標
- 智慧指標指標
- PLC結構化文字(ST)——指標和引用(Pointer&Reference)指標
- [CPP] 智慧指標指標
- 指標 (轉)指標
- 什麼是智慧指標?為什麼要用智慧指標?指標
- 簡析CWE-476:NULL Pointer Dereference空指標解引用漏洞Null指標
- 第一個包含實時安全指標---DigiCert Smart Seal指標
- openfoam 智慧指標探索指標
- vtk智慧指標指標
- 智慧指標學習指標
- 【c++】智慧指標C++指標
- C++智慧指標C++指標
- 智慧指標之手撕共享指標shared_ptr指標
- UE4 智慧指標指標
- 批註:智慧指標分析指標
- C++11 智慧指標C++指標
- 「C++」理解智慧指標C++指標
- auto_ptr 智慧指標指標
- 智慧指標用法學習指標
- CR指標(轉載)指標
- 淺談指標 (轉)指標
- 指標問題的一點體會(區別 [指向指標的指標] 與 [指標的指標] .) (轉)指標
- 指標+AI:邁向智慧化,讓指標應用更高效指標AI
- C++ 用智慧指標這樣包裝 this 指標是否可行C++指標
- C++進階(智慧指標)C++指標
- C++11智慧指標用法C++指標
- C++ 智慧指標詳解C++指標
- C++指標轉換C++指標
- 人氣指標(轉載)指標
- 隨機指標(轉載)隨機指標
- 我眼中的指標 (轉)指標
- 改變滑鼠指標 (轉)指標
- NULL 指標、零指標、野指標Null指標
- C++標準庫有四種智慧指標C++指標