智慧型指標引入為了解決的問題:
記憶體洩漏
示例:
#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乙個物件...