C 智慧型指標(auto ptr)

2021-09-13 01:34:47 字數 1752 閱讀 4173

智慧型指標:

在c++中使用堆記憶體是非常頻繁的操作,堆記憶體的申請和釋放都由程式設計師自己管理。使用普通指標,容易造成堆記憶體洩露,二次釋放等問題,使用智慧型指標能更好的管理堆記憶體。c++11中引入了智慧型指標的概念,方便管理堆記憶體。

棧、堆區別

棧:系統開闢 系統釋放

堆:手動開闢 手動釋放

設計:手動開闢 系統釋放

圖示:

手動開闢堆記憶體,利用物件生存週期結束後會呼叫析構,讓物件來管理這個堆記憶體,從而達到 手動開闢,系統析構的目的。

最初始的智慧型指標:管理權唯一

如果有多個智慧型指標指向同乙個堆記憶體,會在拷貝構造或賦值過程中讓其他的智慧型指標失效(置空)

#includeusing namespace std;

templateclass smartptr

smartptr(const smartptr& rhs):mptr(rhs.mptr)//讓兩個智慧型指標指向同乙個堆記憶體

smartptroperator=(const smartptr& rhs)

return *this;

}~smartptr()

private:

void release()const//舊的智慧型指標置為空

private:

t* mptr;

};int main()

除錯結果:

可以看出,當生成sp2時,sp1指向為空,指向的記憶體正是p所指向的堆記憶體。

可以看出,sp1=sp2;執行後,記憶體的管理權在sp1手上。

普通指標有指向和解引用的使用方法,同理智慧型指標也具有,需要運算子的過載。

#includeusing namespace std;

templateclass smartptr

smartptr(const smartptr& rhs) :mptr(rhs.mptr)//讓兩個智慧型指標指向同乙個堆記憶體

smartptr& operator=(const smartptr& rhs)

return *this;

}t& operator*()//解引用運算子的過載

t* operator->()//指向運算子的過載

~smartptr()

private:

void release()const//舊的智慧型指標置為空

private:

t* mptr;

};class test

void show()

private:

int ma;

};int main()

解釋:(*sp3.operator->()).show();//(sp3.operator->())->show();

sp3.operator->()返回乙個 t* 指標,*t解引用,即物件,物件呼叫方法,合情合理。

C 智慧型指標 auto ptr

智慧型指標 auto ptr vc版本 擁有權管理和轉移 當乙個智慧型指標給另乙個智慧型指標初始化的時候,兩個智慧型指標將會同時指向乙個空間,這樣在物件析構的時候,會導致一塊空間釋放多次的問題,所以乙個物件從始至終只能擁有乙個智慧型指標,這樣就保證不會乙個物件多次釋放的問題.我們讓指標給指標初始化的...

C 智慧型指標auto ptr

template class auto ptr 建構函式 templateinline auto ptr auto ptr t p pointee p 拷貝建構函式 templateinline auto ptr auto ptr auto ptr rhs pointee rhs.release t...

C 智慧型指標 auto ptr

auto ptr是智慧型指引,可以自我銷毀而不像new出來的物件一樣需要呼叫delete銷毀。auto ptr賦值用引起所有權的交接,作為函式引數或返回值都會引起所有權的交接。auto ptr必須顯示初始化 auto ptrp new int 43 ok auto ptrp new int 43 e...