C 知識點複習 智慧型指標分析

2021-10-25 20:29:58 字數 3257 閱讀 6932

智慧型指標引入為了解決的問題:

記憶體洩漏

示例:

#include

#include

using

namespace std;

class

test

intvalue()

~test()

};intmain()

return0;

}

智慧型指標示例:

#include

#include

using

namespace std;

class

test

intvalue()

~test()

};class

pointer

//智慧型指標類

//過載賦值操作符和拷貝建構函式,解決「一片堆空間最多只能由乙個指標標識」

pointer

(const pointer& obj)

pointer&

operator=(

const pointer& obj)

return

*this;}

test*

operator

->()

test&

operator*(

)//返回當前指標所指向的變數或者物件

bool

isnull()

~pointer()

};intmain()

執行結果

test

(int i)01

0~test

()

智慧型指標的使用軍規:

只能用來指向堆空間中的物件或者變數

小結:

指標特徵操作符(-> 和 *)

過載指標特徵符能夠使用物件代替指標

智慧型指標只能用於指向堆空間中的記憶體

智慧型指標的意義在於最大程度的避免記憶體問題

stl中的智慧型指標類auto_ptr:

auto_ptr智慧型指標類模板示例:

#include

#include

#include

using

namespace std;

class

test

void

print()

~test()

};intmain()

執行結果

hello, superman.

pt =

0x863e008

i'm superman.

pt =

0pt1 =

0x863e008

//堆空間的起始位址轉移

i'm superman.

goodbye, superman.

stl中的其他智慧型指標:

qt中的智慧型指標類模板示例:

#include

#include

#include

class

test

:public qobject

void

print()

~test()

};intmain()

編譯結果:

hello xx

i'm "xx"

.//沒有呼叫析構函式, pt結束沒有銷毀堆空間裡面指向的物件

i'm "xx"

.i'm "xx"

.goodbye,

"xx"

.//手工delete釋放

pt =

qobject

(0x0

)pt1 =

qobject

(0x0

)pt2 =

qobject

(0x0

)//qpointer類模板的物件所指向的堆空間被釋放了,所有指向堆空間的智慧型指標都被置空,避免記憶體多次釋放

hello superman

i'm "superman"

. i'm "superman"

.i'm "superman"

.goodbye,

"superman"

.

qt中的其他智慧型指標:

建立智慧型指標類模板示例:

smartpointer.h 

#ifndef _smartpointer_h_

#define _smartpointer_h_

template

<

typename t >

class

smartpointer

smartpointer

(const smartpointer

& obj)

//所有權的轉移發生在拷貝構造和賦值操作函式中

smartpointer

&operator=(

const smartpointer

& obj)

return

*this;}

t*operator

->()

t&operator*(

)bool

isnull()

t*get()~

smartpointer()

};#endif

smartpointer.cpp

#include

#include

#include

"smartpointer.h"

using

namespace std;

class

test

void

print()

~test()

};intmain()

執行結果:

//類似於auto_ptr的功能

hello, superman.

pt =

0xf31c20

i'm superman.

pt =

0pt1 =

0xf31c20

i'm superman.

goodbye, superman.

小結:

智慧型指標是c++中自動記憶體管理的主要手段

智慧型指標在各種平台上都有不同的表現形式

智慧型指標能夠盡可能的避開記憶體相關的問題

stl和qt中都提供了對智慧型指標的支援

c 智慧型指標複習筆記

shared ptr 變數出了作用域之後智慧型指標會析構,引用計數 1,直到為0時銷毀物件,呼叫物件的析構函式,哪怕是出現了異常。weak ptr解決迴圈引用問題 unique ptr它不允許其他的智慧型指標共享其內部的指標,不允許通過賦值將乙個unique ptr賦值給另乙個unique ptr ...

C 複習之智慧型指標

複習智慧型指標時正好看到new的最基本用法 內建的new操作符,經常使用的t ptr new t 分配記憶體,呼叫建構函式 呼叫operator new分配記憶體,operator new sizeof a 呼叫建構函式生成類物件,a a 呼叫placement new 返回相應指標 事實上,分配記...

C 知識點34 動態記憶體與智慧型指標

一 動態記憶體 動態記憶體所在的位置在堆區,由程式設計師手動分配並手動釋放,而不像棧記憶體由系統分配和自動釋放 c 通過new運算子為物件在堆上分配記憶體空間並返回該物件的位址,並用delete運算子銷毀物件並釋放物件所佔的動態記憶體,如果分配動態記憶體後沒有手動釋放會產生記憶體洩露 new乙個物件...