# 使用智能指针管ç†åЍæ€åˆ†é…内å˜å¯¹è±¡ ## 概述 æ™ºèƒ½æŒ‡é’ˆæ˜¯è¡Œä¸ºç±»ä¼¼æŒ‡é’ˆçš„ç±»ï¼Œåœ¨æ¨¡æ‹ŸæŒ‡é’ˆåŠŸèƒ½çš„åŒæ—¶æä¾›å¢žå¼ºç‰¹æ€§ï¼Œå¦‚针对具有动æ€åˆ†é…内å˜å¯¹è±¡çš„自动内å˜ç®¡ç†ç‰ã€‚ * 自动内å˜ç®¡ç†ä¸»è¦æ˜¯æŒ‡å¯¹è¶…出生命周期的对象æ£ç¡®å¹¶è‡ªåŠ¨åœ°é‡Šæ”¾å…¶å†…å˜ç©ºé—´ï¼Œä»¥é¿å…å‡ºçŽ°å†…å˜æ³„æ¼ç‰ç›¸å…³å†…å˜é—®é¢˜ã€‚ * 智能指针对æ¯ä¸€ä¸ªRefBase对象具有两ç§ä¸åŒçš„引用形å¼ã€‚å¼ºå¼•ç”¨æŒæœ‰å¯¹ä¸€ä¸ªå¯¹è±¡çš„直接引用。 具有强引用关系的对象在该强引用关系å˜åœ¨æ—¶åŒæ ·ä¹Ÿåº”当å˜åœ¨ï¼Œä¹Ÿå³è¯¥å¼•ç”¨å…³ç³»æœ‰æ•ˆï¼›å¼±å¼•ç”¨æŒæœ‰å¯¹ä¸€ä¸ªå¯¹è±¡çš„间接引用。 具有弱引用关系的对象在该弱引用关系å˜åœ¨æ—¶å¹¶ä¸ä¿è¯å˜åœ¨ã€‚ > 注æ„:上述æè¿°ä»…当æ£ç¡®ä½¿ç”¨æ™ºèƒ½æŒ‡é’ˆæ—¶æ‰æˆç«‹ã€‚ ### å®žçŽ°åŽŸç† * 智能指针通过引用计数æ¥å®žçŽ°æ‰€æŒ‡å‘对象内å˜çš„自动管ç†ã€‚æ¯ä¸€ä¸ªå¯ä»¥è¢«æ™ºèƒ½æŒ‡é’ˆç®¡ç†çš„å¯¹è±¡éƒ½æŒæœ‰ä¸€ä¸ªå¼•用计数器,引用计数器在相关引用计数清0时会调用一个用于销æ¯è¯¥å¯¹è±¡çš„回调函数。 * 引用计数器记录了对应RefBase对象的两ç§ä¸åŒå¼•用计数值,以åŠå¯¹äºŽå…¶æœ¬èº«ï¼Œå³RefCounter对象的引用计数值。 ## 涉åŠåŠŸèƒ½ ### OHOS::sptr **模å—:** **SmartPointer** 指å‘RefBase(或其åç±»)对象的强引用智能指针。 #### 具体æè¿° ```cpp template <typename T > class OHOS::sptr; ``` 指å‘RefBase(或其åç±»)对象的强引用智能指针。 **模æ¿å‚æ•°**: * **T** 被sptr管ç†çš„具体类型。该类必须继承自RefBase基类。 其直接引用RefBase对象。 `#include <refbase.h>` #### 接å£è¯´æ˜Ž | 返回类型 | åç§° | | --------------------------------------- | -------------------------------------------------------------------------------- | | | **sptr**() | |sptr< T > | template <typename... Args><br>**MakeSptr**(Args&&... args)<br>æž„é€ T类型的被管ç†å¯¹è±¡å¹¶åˆ›å»ºsptrç®¡æŽ§ï¼Œä¼ é€’å‚æ•°args为Tç±»åž‹æž„é€ å‡½æ•°æ‰€éœ€å‚æ•°<br> **注æ„:å¼ºçƒˆå»ºè®®ä½¿ç”¨è¯¥æ–¹æ³•æž„é€ sptr并管控对象,å¯ä»¥é¿å…对象指针对外暴露,将对象的生命周期完全处于智能指针的管控之下** | | template <typename O \> <br> | **sptr**(const sptr< O >& other)<br>æ‹·è´æž„é€ å‡½æ•°ï¼Œå‚æ•°ä¸Žå½“å‰sptr具有ä¸åŒçš„管ç†ç±»åž‹(O) | | | **sptr**(const sptr< T >& other)<br>æ‹·è´æž„é€ å‡½æ•°ã€‚å…¶ä»¥å‚æ•°æŒ‡å®šå…·ä½“管ç†å¯¹è±¡ | | | **sptr**(sptr< T >&& other)<br>ç§»åŠ¨æž„é€ å‡½æ•° | | | **sptr**(T* other)<br>æž„é€ å‡½æ•°ã€‚å…¶ä»¥å‚æ•°æŒ‡å®šå…·ä½“管ç†å¯¹è±¡<br> **注æ„: ä¸å»ºè®®ä½¿ç”¨å¯¹è±¡æŒ‡é’ˆçš„形弿ž„é€ sptr对象,这会导致对象的生命周期ä¸å®Œå…¨åœ¨sptr的看护下,很å¯èƒ½è¯¯ç”¨é€ æˆå¯¹è±¡æå‰é‡Šæ”¾** | | | **sptr**(WeakRefCount* p, bool force)<br>æž„é€ å‡½æ•°ã€‚ä»…ç”¨äºŽwptrçš„promoteæ“作 | | | **~sptr**() | | void | **clear**()<br>移除当å‰sptr与所管ç†å¯¹è±¡çš„引用关系 | | void | **ForceSetRefPtr**(T* other)<br>强制更改被管ç†å¯¹è±¡æŒ‡é’ˆçš„æŒ‡å‘ | | T* | **GetRefPtr**() const<br>获å–sptr管ç†å¯¹è±¡çš„æŒ‡é’ˆ | | | **operator T***() const<br>类型转æ¢è¿ç®—符 | | | **operator bool**() const<br>布尔类型转æ¢è¿ç®—符。检查sptr对象是å¦ä¸ºç©ºå¯¹è±¡ | | bool | **operator!=**(const sptr< T >& other) const<br>sptr对象间的ä¸ç‰è¿ç®—符 | | bool | **operator!=**(const T* other) const<br>sptr对象与裸指针间的ä¸ç‰è¿ç®—符 | | bool | **operator!=**(const wptr< T >& other) const<br>sptr对象与wptr间的相ç‰è¿ç®—符 | | T& | **operator***() const<br>解引用è¿ç®—符,其会返回wptr管ç†çš„RefBae对象 | | T* | **operator->**() const<br>æˆå‘˜é€‰æ‹©è¿ç®—符,其将会返回被sptr管ç†å¯¹è±¡çš„æŒ‡å®šæˆå‘˜ | | template <typename O \> <br>sptr< T >& | **operator=**(const sptr< O >& other)<br>æ‹·è´èµ‹å€¼è¿ç®—ç¬¦ï¼Œå‚æ•°ä¸ºä¸€ä¸ªsptr对象,但与当å‰sptr对象具有ä¸åŒç®¡ç†ç±»åž‹ | | sptr< T >& | **operator=**(const sptr< T >& other)<br>æ‹·è´èµ‹å€¼è¿ç®—ç¬¦ï¼Œå‚æ•°ä¸Žå½“å‰sptr对象具有相åŒç®¡ç†ç±»åž‹ | | sptr< T >& | **operator=**(const wptr< T >& other)<br>æ‹·è´èµ‹å€¼è¿ç®—ç¬¦ï¼Œå‚æ•°ä¸ºä¸€ä¸ªwptr对象,但与当å‰sptr对象具有相åŒç®¡ç†ç±»åž‹ | | sptr< T >& | **operator=**(sptr< T >&& other)<br>ç§»åŠ¨æž„é€ è¿ç®—符 | | sptr< T >& | **operator=**(T* other)<br>æ‹·è´èµ‹å€¼è¿ç®—ç¬¦ï¼Œå‚æ•°ä¸ºå¾…管ç†çš„具体对象<br>**注æ„: ä¸å»ºè®®ä»¥æŒ‡é’ˆèµ‹å€¼çš„å½¢å¼åˆ›å»ºsptr对象,这会导致对象的生命周期ä¸å®Œå…¨åœ¨sptr的看护下,很å¯èƒ½è¯¯ç”¨é€ æˆå¯¹è±¡æå‰é‡Šæ”¾** | | bool | **operator==**(const sptr< T >& other) const<br>sptr对象间的相ç‰è¿ç®—符 | | bool | **operator==**(const T* other) const<br>sptr对象与裸指针间的相ç‰è¿ç®—符 | | bool | **operator==**(constwptr< T >& other) const<br>sptr对象与wptr间的相ç‰è¿ç®—符 | ### OHOS::wptr **模å—:** **SmartPointer** 指å‘RefBase(或其åç±»)对象的弱引用智能指针。 #### 具体æè¿° ```cpp template <typename T > class OHOS::wptr; ``` 指å‘RefBase(或其åç±»)对象的弱引用智能指针。 **模æ¿å‚æ•°**: * **T** 被wptr管ç†çš„具体类型。该类必须继承自RefBase基类。 其间接引用RefBase对象;直接引用WeakRefCounter对象。 `#include <refbase.h>` #### 接å£è¯´æ˜Ž | 返回类型 | åç§° | | --------------------------------------- | ------------------------------------------------------------------------------------ | | | **wptr**() | | template <typename O \> <br> | **wptr**(const sptr< O >& other)<br>æ‹·è´æž„é€ å‡½æ•°ã€‚å‚æ•°ä¸ºä¸€ä¸ªsptr对象,且与当å‰wptr对象具有ä¸åŒçš„管ç†ç±»åž‹(O) | | | **wptr**(const sptr< T >& other)<br>æ‹·è´æž„é€ å‡½æ•°ã€‚å‚æ•°ä¸ºä¸€ä¸ªsptr对象,但与当å‰wptr对象具有相åŒçš„管ç†ç±»åž‹ | | template <typename O \> <br> | **wptr**(const wptr< O >& other)<br>æ‹·è´æž„é€ å‡½æ•°ã€‚å‚æ•°ä¸Žå½“å‰wptr对象具有ä¸åŒçš„管ç†ç±»åž‹ | | | **wptr**(const wptr< T >& other)<br>æ‹·è´æž„é€ å‡½æ•°ã€‚å‚æ•°ä¸Žå½“å‰wptr对象具有相åŒçš„管ç†ç±»åž‹ | | | **wptr**(T* other)<br>æž„é€ å‡½æ•°ã€‚å…¶ä»¥å‚æ•°æŒ‡å®šå…·ä½“管ç†å¯¹è±¡ | | | **~wptr**() | | bool | **AttemptIncStrongRef**(const void* objectId) const<br>å°è¯•对被管ç†å¯¹è±¡çš„å¼ºå¼•ç”¨è®¡æ•°åŠ ä¸€ | | T* | **GetRefPtr**() const<br>èŽ·å–æŒ‡å‘被管ç†RefBase对象的指针 | | bool | **operator!=**(const sptr< T >& other) const<br>wptr与输入sptr对象间的ä¸ç‰è¿ç®—符 | | bool | **operator!=**(const T* other) const<br>wptr对象与裸指针间的ä¸ç‰è¿ç®—符 | | bool | **operator!=**(constwptr< T >& other) const<br>wptr对象间的ä¸ç‰è¿ç®—符 | | T& | **operator***() const<br>解引用è¿ç®—符,其会返回wptr管ç†çš„RefBae对象 | | T* | **operator->**() const<br>æˆå‘˜é€‰æ‹©æ“作符,其将会返回被wptr管ç†å¯¹è±¡çš„æŒ‡å®šæˆå‘˜ | | template <typename O \> <br>wptr< T >& | **operator=**(const sptr< O >& other)<br>æ‹·è´èµ‹å€¼è¿ç®—ç¬¦ï¼Œå‚æ•°ä¸ºä¸€ä¸ªsptr对象,但与当å‰wptr对象具有ä¸åŒçš„管ç†ç±»åž‹(O) | | wptr< T >& | **operator=**(const sptr< T >& other)<br>æ‹·è´èµ‹å€¼è¿ç®—ç¬¦ï¼Œå‚æ•°ä¸ºä¸€ä¸ªsptr对象,但与当å‰wptr对象具有相åŒçš„管ç†ç±»åž‹(T) | | template <typename O \> <br>wptr< T >& | **operator=**(const wptr< O >& other)<br>æ‹·è´èµ‹å€¼è¿ç®—ç¬¦ï¼Œå‚æ•°ä¸ºä¸€ä¸ªwptr对象,但与当å‰wptr对象具有ä¸åŒçš„管ç†ç±»åž‹(O) | | wptr< T >& | **operator=**(const wptr< T >& other)<br>æ‹·è´èµ‹å€¼è¿ç®—ç¬¦ï¼Œå‚æ•°ä¸ºä¸€ä¸ªwptr对象,且与当å‰wptr对象具有相åŒçš„管ç†ç±»åž‹(T) | | template <typename O \> <br>wptr< T >& | **operator=**(O* other)<br>æ‹·è´èµ‹å€¼è¿ç®—ç¬¦ï¼Œå‚æ•°ä¸ºå¾…管ç†çš„具体对象 | | wptr< T >& | **operator=**(T* other)<br>æ‹·è´èµ‹å€¼è¿ç®—ç¬¦ï¼Œå‚æ•°ä¸ºå¾…管ç†çš„具体对象 | | bool | **operator==**(const sptr< T >& other) const<br>wptr与输入sptr对象间的相ç‰è¿ç®—符 | | bool | **operator==**(const T* other) const<br>wptr对象与裸指针间的相ç‰è¿ç®—符 | | bool | **operator==**(const wptr< T >& other) const<br>wptr对象间的相ç‰è¿ç®—符 | | const sptr< T > | **promote**() const<br>将该wptræå‡ä¸ºsptr | ## 使用示例 1. 使用方法(伪代ç ) ``` #include "../include/refbase.h" #include <iostream> using namespace std; using namespace OHOS; // 管ç†ç›®æ ‡ç±» class RefBaseTest : public RefBase { public: virtual void Access() { cout<<"Access RefBaseTest::Show"<<endl; } ~RefBaseTest() override { cout << "RefBaseTest destroyed" << endl; } }; // 管ç†ç›®æ ‡ç±»çš„åç±» class SubRefBaseTest : public RefBaseTest { public: void Access() override { cout<<"Access SubRefBaseTest::Show"<<endl; } ~SubRefBaseTest() override { cout << "SubRefBaseTest destroyed" << endl; } }; int main() { // 1. ä½¿ç”¨æ–°åˆ›å»ºæ™ºèƒ½æŒ‡é’ˆï¼Œç®¡ç†æ–°åˆ›å»ºå¯¹è±¡ sptr<RefBaseTest> newSptr(new RefBaseTest()); wptr<RefBaseTest> newWptr(new RefBaseTest()); // 2. 使用上述智能指针,管ç†å¦ä¸€ä¸ªæ–°åˆ›å»ºå¯¹è±¡ // 原管ç†å¯¹è±¡æžæž„ newSptr = new RefBaseTest(); newWptr = new RefBaseTest(); // 3. 使用新创建智能指针,指å‘å…¶ä»–çŽ°å˜æ™ºèƒ½æŒ‡é’ˆç®¡ç†å¯¹è±¡ sptr<RefBaseTest> curSptr(newSptr); wptr<RefBaseTest> curWptr(newWptr); if (curSptr->GetSptrRefCount() == 2 && curSptr->GetWptrRefCount() == 2 && // 2: count curWptr->GetWptrRefCount() == 1) { cout << "curSptr run as expected" << endl; } // 4. ä½¿ç”¨çŽ°å˜æ™ºèƒ½æŒ‡é’ˆç®¡ç†å…¶æ‰˜ç®¡ç±»åž‹çš„å类对象 sptr<SubRefBaseTest> subSptr(new SubRefBaseTest()); wptr<SubRefBaseTest> subWptr(new SubRefBaseTest()); curSptr = subSptr; curWptr = subWptr; // 5. 通过->è¿ç®—符访问æˆå‘˜" curSptr->Access(); curWptr->Access(); // 6. 通过*è¿ç®—符解引用 (*curSptr).Access(); (*curSptr).Access(); // 7. ä¸¤ç§æ™ºèƒ½æŒ‡é’ˆå¯ä»¥ç®¡ç†å¯¹æ–¹æ‰€ç®¡ç†çš„对象 sptr<RefBaseTest> scurSptr(new RefBaseTest); wptr<RefBaseTest> scurWptr(new RefBaseTest); wptr<RefBaseTest> snewWptr(scurSptr); sptr<RefBaseTest> soldSptr(new RefBaseTest); wptr<RefBaseTest> soldWptr(new RefBaseTest); soldSptr = scurWptr; // spträ»…å¯é€šè¿‡æ‹·è´èµ‹å€¼ç®¡ç†wptr所管ç†å¯¹è±¡ soldWptr = scurSptr; // 原本的引用关系将被释放 if (snewWptr->GetWptrRefCount() == 3 && soldSptr->GetSptrRefCount() == 1 && // 3: count soldWptr->GetWptrRefCount() == 3) { // 3: count cout << "Smart Pointer assignment run as expected" << endl; } // 8. wptrå¯å‡çº§ä¸ºsptr sptr<RefBaseTest> spromotedWptr = snewWptr.promote(); // å‡çº§å¤±è´¥æ—¶è¿”回空sptrå¯¹è±¡ï¼Œå³æœªç®¡ç†å…·ä½“对象的sptr对象 if (spromotedWptr->GetSptrRefCount() == 2 && spromotedWptr->GetWptrRefCount() == 4) { // 2, 4: count cout << "Promote run as expected" << endl; } return 0; } ``` 2. 测试用例编译è¿è¡Œæ–¹æ³• - 测试用例代ç å‚è§ base/test/unittest/common/utils_refbase_test.cpp - 使用开å‘者自测试框架,使用方法å‚è§ï¼š[å¼€å‘自测试执行框架-测试用例执行](https://gitee.com/openharmony/testfwk_developer_test#%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B%E6%89%A7%E8%A1%8C) - 使用以下具体命令以è¿è¡Œ`refbase.h`对应测试用例 ```bash run -t UT -tp utils -ts UtilsRefBaseTest ``` 3. debug功能 RefTracker作为debugå·¥å…·è¢«æ·»åŠ å…¥refbase文件ä¸ï¼Œä»¥ä¾¿å¼€å‘者对RefBase相关问题进行定ä½ã€‚该功能需è¦é‡æ–°ç¼–译动æ€åº“替æ¢ç³»ç»ŸåŽŸæœ‰åŠ¨æ€åº“æ¥ä¸Šæœºä½¿ç”¨ï¼ˆå¦‚æ˜¯é™æ€ä¾èµ–则需开å‘者独立审视使能方法)。 - 全局追踪 å…¨å±€è¿½è¸ªåŠŸèƒ½é€šè¿‡ç¼–è¯‘å®æŽ§åˆ¶ï¼Œå¯ä»¥è¿½è¸ªå…¨å±€çš„RefBaseåŠå…¶åç±»çš„è½¨è¿¹ï¼Œä½†åŒæ—¶ä¼šå¯¹æ•´æœºæ€§èƒ½é€ æˆå½±å“。 å…¨å±€è¿½è¸ªä¸æˆ‘们æä¾›äº†ç«‹å³æ‰“å°æ¨¡å¼åŠéžç«‹å³æ‰“å°æ¨¡å¼ã€‚ç«‹å³æ‰“å°æ¨¡å¼ä¼šåœ¨æ¯æ¬¡å¼•用计数å‘生å˜åŒ–时对计数进行打å°ã€‚éžç«‹å³æ‰“å°æ¨¡å¼ä¼šåœ¨RefBaseåŠå…¶åç±»å¯¹è±¡æžæž„时对轨迹进行打å°ã€‚ 全局追踪ã€ç«‹å³æ‰“å°ç¼–译命令: ``` ./build.sh --product-name xxx --ccache --build-target commonlibrary/c_utils/base:utils --gn-args c_utils_debug_refbase=true --gn-args c_utils_track_all=true --gn-args c_utils_print_track_at_once=true ``` 全局追踪ã€éžç«‹å³æ‰“å°ç¼–译命令: ``` ./build.sh --product-name xxx --ccache --build-target commonlibrary/c_utils/base:utils --gn-args c_utils_debug_refbase=true --gn-args c_utils_track_all=true ``` - 独立追踪 ç‹¬ç«‹è¿½è¸ªåŠŸèƒ½åŒæ ·èƒ½é€šè¿‡ç¼–è¯‘å®æŽ§åˆ¶ã€‚æˆ‘ä»¬ä¸ºå¼€å‘者æä¾›äº†RefBase::EnableTracker()æŽ¥å£æ¥å¯¹æŸä¸ªå…·ä½“实例使能追踪功能。独立追踪对性能影å“很å°ï¼Œå¯ä»¥å¿½ç•¥ä¸è®¡ã€‚åœ¨ç‹¬ç«‹è¿½è¸ªä¸æˆ‘ä»¬èƒ½åŒæ ·æä¾›äº†ç«‹å³æ‰“å°åŠéžç«‹å³æ‰“å°æ¨¡å¼ã€‚ 独立追踪ã€ç«‹å³æ‰“å°ç¼–译命令: ``` ./build.sh --product-name xxx --ccache --build-target commonlibrary/c_utils/base:utils --gn-args c_utils_debug_refbase=true --gn-args c_utils_print_track_at_once=true ``` 独立追踪ã€éžç«‹å³æ‰“å°ç¼–译命令: ``` ./build.sh --product-name xxx --ccache --build-target commonlibrary/c_utils/base:utils --gn-args c_utils_debug_refbase=true ``` - 使用方法 编译动æ€åº“,编译产物路径为`./out/xxx/commonlibrary/c_utils/libutils.z.so`。 ç¼–è¯‘äº§ç‰©éœ€è¦æŽ¨å…¥ç³»ç»Ÿè¿›è¡Œæ›¿æ¢ï¼Œ64ä½ç³»ç»Ÿä½äºŽ`/system/lib64/`,32ä½ç³»ç»Ÿä½äºŽ`/system/lib/`。 追踪结果通过log打å°ã€‚æ ¼å¼å¦‚下: ``` // ç«‹å³æ‰“å° (sptr pointer) start tracking (sptr pointer) call (RefBase pointer). strong: x weak: x refcnnt: x ... (sptr pointer) call (RefBase pointer). strong: x weak: x refcnnt: x (sptr pointer) end tracking // éžç«‹å³æ‰“å° (sptr pointer) start backtrace (sptr pointer) call (RefBase pointer). strong: x weak: x refcnnt: x PID: xxx TID: xxx ... (sptr pointer) call (RefBase pointer). strong: x weak: x refcnnt: x PID: xxx TID: xxx (sptr pointer) end backtrace ``` ## 常è§é—®é¢˜ 1. **ä½¿ç”¨æœ¬å®žçŽ°æ™ºèƒ½æŒ‡é’ˆæ—¶ï¼ŒåŒæ—¶ä½¿ç”¨è£¸æŒ‡é’ˆæˆ–stdæ ‡å‡†åº“æ™ºèƒ½æŒ‡é’ˆ(std::shared_ptr)** * ä¼šé€ æˆç®¡ç†å†²çªï¼Œå¯¼è‡´éžæ³•è®¿é—®ä»¥åŠæœªå®šä¹‰è¡Œä¸ºï¼Œå¦‚内å˜é‡å¤é‡Šæ”¾ã€‚ * å› æ¤ä¹Ÿä¸æŽ¨è先创建裸指针åŽï¼Œå†ä½¿ç”¨æ™ºèƒ½æŒ‡é’ˆç®¡ç†ã€‚ ```c++ RefBase* a = new RefBase(); sptr<RefBase> s = a; // 或 sptr<RefBase> s(a); // 裸指针a容易被误delete,é€ æˆsptr功能失常 ``` 2. **æ™ºèƒ½æŒ‡é’ˆéœ€æž„é€ åœ¨æ ˆä¸Šï¼Œç®¡ç†çš„对象需è¦åœ¨å †ä¸Š(动æ€åˆ†é…对象)** * æ™ºèƒ½æŒ‡é’ˆè‹¥æž„é€ åœ¨å †ä¸Šåˆ™ä¸ç¬¦åˆå®šä¹‰ã€‚ * 管ç†å¯¹è±¡è‹¥æž„é€ åœ¨æ ˆä¸Šï¼Œåˆ™ä¼šè‡ªåŠ¨é‡Šæ”¾ï¼Œé”™è¯¯ç»•å¼€æ™ºèƒ½æŒ‡é’ˆç®¡æŽ§ã€‚ 3. **智能指针ä¸ä¿è¯çº¿ç¨‹å®‰å…¨**,使用者需ä¿è¯çº¿ç¨‹å®‰å…¨ä»¥é¿å…åŒæ—¶å¯¹åŒä¸€ä¸ªsptrå¯¹è±¡èµ‹å€¼ç‰æ“作 4. **é¿å…通过éšå¼è½¬æ¢æž„é€ æ™ºèƒ½æŒ‡é’ˆå¯¹è±¡** * æ˜“é€ æˆè¯¯è§£ã€‚ * å› ç¼–è¯‘å™¨ä¼˜åŒ–ç¨‹åº¦å…·æœ‰ä¸ç¡®å®šçš„è¡Œä¸ºï¼Œæ˜“é€ æˆé—®é¢˜ã€‚ 5. **ä¸å»ºè®®ä½¿ç”¨å¯¹è±¡æŒ‡é’ˆæž„é€ æ™ºèƒ½æŒ‡é’ˆå¯¹è±¡** * 外部æå‰ä»¥æŒ‡é’ˆå½¢å¼é‡Šæ”¾å¯¹è±¡åŽï¼Œç»§ç»é€šè¿‡æ™ºèƒ½æŒ‡é’ˆä¸ä½¿ç”¨ * sptr引用计数为0é‡Šæ”¾å¯¹è±¡ï¼Œå¯¹è±¡æŒ‡é’ˆä¾æ—§åœ¨å¤–被继ç»ä½¿ç”¨ ```cpp Refbase *a = new Refbase(arg1, arg2); sptr<Refbase> sp1 = a; // ä¸å»ºè®®ï¼Œå¯¹è±¡æŒ‡é’ˆa暴露在外,å˜åœ¨é£Žé™© sptr<Refbase> sp2(a); // ä¸å»ºè®®ï¼Œå¯¹è±¡æŒ‡é’ˆa暴露在外,å˜åœ¨é£Žé™© sptr<Refbase> sp3 = sptr<Refbase>::MakeSptr(arg1, arg2); // å»ºè®®ï¼Œåœ¨å†…éƒ¨æž„é€ Refbase对象,直接交与sptr管控使用 ``` 6. **wptr使用注æ„** * 在未设置**ExtendObjectLifetime**的情况下,wpträ¸å‚与被管ç†å¯¹è±¡çš„生命周期控制,对象生命周期由sptr的引用计数控制,但在æžç‰¹æ®Šæƒ…况下å˜åœ¨ä¾‹å¤– ```cpp // 由于历å²è®¾è®¡åŽŸå› ï¼Œå¯ä»¥åœ¨spträ¸å˜åœ¨çš„æƒ…况下,基于对象指针创建wptr对象。 // 在未设置ExtendObjectLifetimeï¼Œä¸”æ— sptrè¢«åˆ›å»ºçš„ç‰¹æ®Šå°‘è§æƒ…况下,为了防æ¢å†…å˜æ³„æ¼ï¼Œåœ¨wptr引用计数归0时会释放管ç†å¯¹è±¡ Refbase *a = new Refbase(arg1, arg2); wptr<Refbase> wp1(a); wp1 = nullptr; // 弱引用计数归0,对象释放,应é¿å…冿¬¡æ‰‹åŠ¨é‡Šæ”¾ wptr<Refbase> wp2 = new Refbase(arg1, arg2); wp2 = nullptr; // 弱引用计数归0ï¼Œå¯¹è±¡é‡Šæ”¾ï¼Œè¿™ç§æƒ…å†µæ— æ³•æ‰‹åŠ¨é‡Šæ”¾, 如果wpträ¸èƒ½æŽ§åˆ¶å¯¹è±¡é‡Šæ”¾åˆ™å¿…然会å‘ç”Ÿå†…å˜æ³„æ¼ ```