基于this
Stroustrup建议“函数ä¸çš„指针ä¸åº”代表所有æƒâ€
问题>有人能给我一些细节解释å—?如果说明一个例å,那就最好。
谢谢
ç”案 0 :(得分:9)
如果代ç è´Ÿè´£åˆ é™¤æŒ‡é’ˆæˆ–å°†æ‰€æœ‰æƒè½¬è®©ç»™å…¶ä»–人,则æŸäº›ä»£ç “拥有â€æŒ‡é’ˆã€‚å„ç§æ™ºèƒ½æŒ‡é’ˆå®žçŽ°æ˜¾å¼æ‰€æœ‰æƒæ¨¡åž‹ã€‚ shared_ptr
表示拥有指针的多段代ç 。 unique_ptr
仅代表拥有指针的一段代ç 。
他所说的是,如果一个函数有一个裸指针(指针ä¸åœ¨æ™ºèƒ½æŒ‡é’ˆä¸ï¼‰ï¼Œå®ƒåº”该ä¸è¢«è®¤ä¸ºæ‹¥æœ‰å®ƒã€‚如果è¦å£°æ˜Žè¿™ä¸ªæŒ‡é’ˆçš„æŸäº›æ‰€æœ‰æƒï¼Œå®ƒåº”该被赋予一个智能指针作为å‚数,或者它应该将它用new
创建的指针å˜å‚¨åœ¨æ™ºèƒ½æŒ‡é’ˆä¸ã€‚
他说åªæœ‰æ™ºèƒ½æŒ‡é’ˆæ‰æœ‰è‡ªå·±çš„指针。如果函数将裸指针作为å‚数,则它ä¸ä¼šå£°æ˜Žè¯¥æŒ‡é’ˆçš„所有æƒã€‚å¦‚æžœå‡½æ•°è¿”å›žä¸€ä¸ªè£¸æŒ‡é’ˆï¼Œä½ å°±ä¸èƒ½å£°æ˜Žè¯¥æŒ‡é’ˆçš„所有æƒã€‚
ç”案 1 :(得分:5)
std::unique_ptr<int> pOwner(new int(5)); // this is the owner
int* pAccess = pOwner.get(); // this is a weak accessor, it does not own anything
他在谈论原始指针在C ++ 11世界ä¸çš„作用。拥有指针æ„味ç€shared_ptr
å’Œunique_ptr
ï¼ˆä»–ä»¬æ˜¯æ‰€æœ‰è€…ï¼Œå› ä¸ºä»–ä»¬è´Ÿè´£åˆ é™¤å¯¹è±¡ï¼‰ã€‚åº”è¯¥ä½¿ç”¨åŽŸå§‹æŒ‡é’ˆæ¥è®¿é—®æ™ºèƒ½æŒ‡é’ˆæ‰€æ‹¥æœ‰çš„对象。在C ++ 11ä¸ï¼Œä½ 基本上没有ç†ç”±å†åœ¨åŽŸå§‹æŒ‡é’ˆä¸Šæ˜¾å¼è°ƒç”¨delete
。
ç”案 2 :(得分:1)
使用new
创建动æ€å¯¹è±¡æ—¶ï¼Œå…¶ä»–一些对象将负责在ä¸å†éœ€è¦æ—¶å°†å…¶åˆ 除;该对象是动æ€å¯¹è±¡ï¼†ï¼ƒ34;所有者&#34;。
å¦‚æžœä½ æ€»æ˜¯ä½¿ç”¨æ™®é€šæŒ‡é’ˆæ¥å¼•ç”¨å¯¹è±¡ï¼Œé‚£ä¹ˆå¾ˆéš¾è¯´ï¼ˆæ²¡æœ‰æ–‡æ¡£ï¼‰è¿™äº›æŒ‡é’ˆä¸çš„哪些指针代表所有æƒã€‚å¦‚æžœæ‚¨å°†æŒ‡é’ˆä¼ é€’ç»™å‡½æ•°ï¼Œé‚£ä¹ˆè¯¥å‡½æ•°æ˜¯å¦å–得所有æƒï¼Ÿæˆ–者æ¥ç”µè€…是å¦è¿˜æœ‰è´£ä»»åˆ é™¤å®ƒï¼Ÿå¦‚æžœä½ å¼„é”™äº†ï¼Œé‚£ä¹ˆä½ è¦ä¹ˆä¸åˆ é™¤å®ƒï¼ˆé€ æˆèµ„æºæ³„æ¼ï¼Œè¿™å¯èƒ½ä¼šé™ä½Žä½ 的程åºçš„性能并最​​终阻æ¢å®ƒå·¥ä½œï¼‰ï¼Œæˆ–è€…ä½ å¯èƒ½ä¼šå¾ˆå¿«åˆ 除它(å¯èƒ½ä¼šå¯¼è‡´å„ç§å„æ ·çš„é”™è¯¯ï¼Œé€šå¸¸å¾ˆéš¾è¿½æŸ¥ã€‚
广泛使用的解决方案是制定一项ç–略,å³å§‹ç»ˆä½¿ç”¨æ™ºèƒ½æŒ‡é’ˆï¼ˆçœ‹ä¼¼æŒ‡é’ˆçš„对象,但包å«ç®¡ç†å…¶ç›®æ ‡ç”Ÿå‘½å‘¨æœŸçš„逻辑)æ¥è¡¨ç¤ºæ‰€æœ‰æƒï¼Œå¹¶ä¸”永远ä¸ä¼šåˆ é™¤ä»»ä½•å†…å®¹ä½ åªæœ‰ä¸€ä¸ªæ™®é€šçš„指针。然åŽï¼Œå¯¹äºŽæ˜¯å¦åˆ 除æŸäº›ä¸œè¥¿ä¸€æ— æ‰€çŸ¥ã€‚æ ‡å‡†åº“æ供了智能指针(unique_ptr
å’Œshared_ptr
),它们通过å•ä¸ªå¯¹è±¡æ供所有æƒçš„公共è¯ä¹‰ï¼Œå¹¶åœ¨å¤šä¸ªå¯¹è±¡ä¹‹é—´å…±äº«æ‰€æœ‰æƒã€‚
这是通过RAII更广泛的资æºç®¡ç†ä¸»é¢˜çš„一个方é¢ï¼Œè¿™åœ¨C ++ä¸éžå¸¸é‡è¦ã€‚除了æ供清晰的所有æƒæ¨¡åž‹å¤–,它还是在抛出异常时å¯é 地防æ¢å†…å˜æ³„æ¼çš„唯一åˆç†æ–¹æ³•ã€‚