如何解释这å¥è¯â€œå‡½æ•°ä¸­çš„指针ä¸åº”代表所有æƒâ€

时间:2012-03-07 19:55:03

标签: c++ c++11

基于this

Stroustrup建议“函数中的指针ä¸åº”代表所有æƒâ€

问题>有人能给我一些细节解释å—?如果说明一个例å­ï¼Œé‚£å°±æœ€å¥½ã€‚

谢谢

3 个答案:

答案 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 ++中éžå¸¸é‡è¦ã€‚除了æ供清晰的所有æƒæ¨¡åž‹å¤–,它还是在抛出异常时å¯é åœ°é˜²æ­¢å†…存泄æ¼çš„唯一åˆç†æ–¹æ³•ã€‚