指針使用中的根本問題:
1. 內(nèi)存泄漏;
2. 野指針(指針指向已經(jīng)被無效的內(nèi)存上);
尤其是當多個指針指向同一個內(nèi)存區(qū)域的時候, 哪個指針來負責(zé)析構(gòu), 是最頭疼的事情了.
針對這種情況, 應(yīng)該先引出指針的所有權(quán)問題:
指針指向的內(nèi)存誰來釋放, 誰就是擁有所有權(quán).
分三類情況:
1. 一個指針有清晰的所有權(quán);
2. 幾個指針共有所有權(quán);
3. 一些指針只有引用權(quán);
共享所有權(quán)指針的需求:
ViSharePtr m_sp1 = new ViObj;
m_sp2 = m_sp1;
m_sp1 = NULL;//! 因為有其他人享有這個所有權(quán), 所以不能執(zhí)行析構(gòu)
m_sp2;//! 還是有效的
m_sp2 = NULL;//! 執(zhí)行析構(gòu)
實現(xiàn)方式: 引用計數(shù)器
引用型指針
ViOwnPtr m_op = new ViObj;//! 所有權(quán)指針
ViRefPtr m_rp = m_op;//! 引用指針
delete m_op;
assert(m_rp == NULL);//! 對象析構(gòu)之后, 所有引用指針置空;
實現(xiàn)方式: 引用列表
Tip:
指針命名:
1. _rp_ 引用指針
2. _op_ 所有權(quán)指針
3. _sp_ 共享指針
引用型指針的使用范圍:
回調(diào)對象;
消息對象;
持有指針狀態(tài)判斷;
1. 內(nèi)存泄漏;
2. 野指針(指針指向已經(jīng)被無效的內(nèi)存上);
尤其是當多個指針指向同一個內(nèi)存區(qū)域的時候, 哪個指針來負責(zé)析構(gòu), 是最頭疼的事情了.
針對這種情況, 應(yīng)該先引出指針的所有權(quán)問題:
指針指向的內(nèi)存誰來釋放, 誰就是擁有所有權(quán).
分三類情況:
1. 一個指針有清晰的所有權(quán);
2. 幾個指針共有所有權(quán);
3. 一些指針只有引用權(quán);
共享所有權(quán)指針的需求:
ViSharePtr m_sp1 = new ViObj;
m_sp2 = m_sp1;
m_sp1 = NULL;//! 因為有其他人享有這個所有權(quán), 所以不能執(zhí)行析構(gòu)
m_sp2;//! 還是有效的
m_sp2 = NULL;//! 執(zhí)行析構(gòu)
實現(xiàn)方式: 引用計數(shù)器
引用型指針
ViOwnPtr m_op = new ViObj;//! 所有權(quán)指針
ViRefPtr m_rp = m_op;//! 引用指針
delete m_op;
assert(m_rp == NULL);//! 對象析構(gòu)之后, 所有引用指針置空;
實現(xiàn)方式: 引用列表
Tip:
指針命名:
1. _rp_ 引用指針
2. _op_ 所有權(quán)指針
3. _sp_ 共享指針
引用型指針的使用范圍:
回調(diào)對象;
消息對象;
持有指針狀態(tài)判斷;