char *pointer1;
char *pointer2;
pointer1 = new char[256];
pointer2 = pointer1;
delete [] pointer1;
æ¢å¥è¯è¯´ï¼Œæˆ‘还必须åšdelete [] pointer2
å—?
谢谢ï¼
ç”案 0 :(得分:17)
ä¸ï¼Œé‚£ä¸ªä»£ç 很好,ä¸ä¼šæ³„æ¼å†…å˜ã€‚
ä½ åªéœ€è¦ä½¿ç”¨delete []ä¸€æ¬¡ï¼Œå› ä¸ºä½ åªä½¿ç”¨ä¸€ä¸ªnewæ¥ä¸ºå†…å˜åˆ†é…一个区域,å³ä½¿æœ‰ä¸¤ä¸ªæŒ‡å‘åŒä¸€ä¸ªå†…å˜çš„指针。
ç”案 1 :(得分:7)
一个简å•çš„规则:您需è¦ä¸Ždelete
ä¸€æ ·å¤šçš„new
sã€‚æ›´å¥½çš„æ˜¯ï¼Œä½¿ç”¨æ™ºèƒ½æŒ‡é’ˆæˆ–å®¹å™¨ä¹‹ç±»çš„ä¸œè¥¿ä¸ºä½ ç…§é¡¾å®ƒã€‚
å¦ä¸€ä¸ªå°é—®é¢˜ï¼špointer2
在delete
上致电pointer1
åŽï¼Œæ£å˜æˆâ€œæ‚¬ç©ºæŒ‡é’ˆâ€ã€‚
ç”案 2 :(得分:4)
è¿™ä¸æ˜¯æ³„æ¼ï¼Œä½†å´åœ¨å¯»æ‰¾éº»çƒ¦ã€‚åªè¦æ‚¨åˆ 除pointer2
,pointer1
就会指å‘è°çŸ¥é“什么。这就是所谓的“悬垂指针â€ã€‚使用它å¯ä»¥åœ¨æœ€å¥½çš„情况下导致段错误,并且在最å的情况下å¯èƒ½å¯¼è‡´åœ¨æœ€ç»ˆåˆ†é…相åŒç‚¹çš„任何事物ä¸å‡ºçŽ°ç¥žç§˜æ•°æ®é”™è¯¯ã€‚
ç”案 3 :(得分:2)
虽然它ä¸ä¼šæ³„æ¼å†…å˜ï¼Œä½†å¦‚æžœä½ æƒ³è¦æ˜¾å¼ï¼Œä½ 应该将point1
å’Œpoint2
都设置为NULL(并以这ç§æ–¹å¼åˆå§‹åŒ–它们。)
ç”案 4 :(得分:2)
æ¤å¤–,请考虑使用Boost库ä¸çš„boost::shared_ptr<>
。这是切片é¢åŒ…以æ¥æœ€æ£’的东西。
typedef boost::shared_ptr<TypeX> StrRef;
foo() {
StrRef pointer1(new TypeX);
while(something) {
StrRef pointer2 = pointer1;
// do stuff
}
return;
}
当指å‘它的最åŽä¸€ä¸ªæŒ‡é’ˆè¶…å‡ºèŒƒå›´æ—¶ï¼Œå°†åˆ é™¤æ•°æ®ï¼ˆTypeX
)。如果您ä¸éœ€è¦å¼•ç”¨è®¡æ•°ï¼Œåˆ™å¯ä»¥ä½¿ç”¨å†…ç½®auto_ptr<>
类型执行类似的æ“作:
typedef auto_ptr<TypeX> StrRef;
foo() {
StrRef pointer1(new TypeX);
while(something) {
TypeX * pointer2 = pointer1.get();
subroutine(pointer2);
if (condition) return;
}
return;
}
æ¯å½“pointer1
è¶…å‡ºèŒƒå›´æ—¶ï¼Œå®ƒéƒ½ä¼šåˆ é™¤æ•°æ®ã€‚è¿™æ ·åšçš„å¥½å¤„æ˜¯ä½ ä¸å¿…记得在底部的returnè¯å¥ä¹‹å‰æ”¾ç½®ä¸€ä¸ªåˆ 除,如果pointer1
ç”±äºŽä»»ä½•å…¶ä»–åŽŸå› è¶…å‡ºèŒƒå›´ï¼ˆå³ä»Žå¾ªçŽ¯çš„ä¸é—´è¿”回,或者subroutine()
抛出异常,然åŽæ•°æ®ä»ç„¶ä¼šè¢«æ£ç¡®é‡Šæ”¾ã€‚
我尚未测试æ¤ä»£ç ï¼Œå› æ¤æ‚¨å¿…须自行检查auto_ptr<>
å’Œboost::shared_ptr<>
的文档。
我强烈建议尽å¯èƒ½ä½¿ç”¨Boost库。它是由专业人士编写的,它基本上是C ++扩展的临时区域。
ç”案 5 :(得分:1)
delete
åˆ é™¤new
分é…的内å˜ã€‚由于您åªæœ‰ä¸€ä¸ªnew
ï¼Œå› æ¤åªéœ€è¦ä¸€ä¸ªdelete
。
ç”案 6 :(得分:0)
仅在使用新
æ—¶ä½¿ç”¨åˆ é™¤å¥½çš„åšæ³•æ˜¯å°†æŒ‡é’ˆè®¾ç½®ä¸ºNULLï¼Œä½†å¦‚æžœä½ æ²¡æœ‰
,就ä¸ä¼šæœ‰å†…å˜æ³„æ¼ç”案 7 :(得分:0)
ä¸ï¼Œä½ ä¸å¿…åˆ é™¤[]指针2ï¼Œå› ä¸ºä½ æ²¡æœ‰ä¸ºå®ƒåˆ†é…内å˜ï¼
è¯å¥pointer2 = pointer1
使pointer2
指å‘与pointer1
相åŒçš„内å˜åœ°å€ï¼Œä¸ä¸ºå…¶åˆ†é…任何é¢å¤–的内å˜ã€‚
ç”案 8 :(得分:0)
æ¯ä¸ªnew
应该åªæœ‰ä¸€ä¸ªdelete
匹é…{{1}}ã€‚å¦‚æžœåˆ é™¤äº†å¦ä¸€ä¸ªæŒ‡é’ˆï¼Œåˆ™ä¼šç ´å该规则。
ç”案 9 :(得分:0)
ä½ åœ¨è¿™é‡Œåšçš„åªæ˜¯è¯´æ˜Žnew char[256]
分é…的内å˜å—将在åŒä¸€æ—¶åˆ»è¢«pointer1
å’Œpointer2
指å‘。
å¦‚æžœä½ ä¹‹åŽå†™äº†delete[] pointer2;
è¯å¥ï¼Œé‚£å°†æ˜¯ä¸€ä¸ªå†…å˜æ³„æ¼ã€‚
ç”案 10 :(得分:0)
这是您æ€è·¯ä¸Šçš„å·®è·ï¼šæ‚¨ä¸åˆ 除指针 - åˆ é™¤å†…å˜ã€‚您åªéœ€ä½¿ç”¨æŒ‡é’ˆæ¥æ ‡è¯†è¦é‡Šæ”¾çš„内å˜å—。由于这两个å˜é‡æŒ‡å‘åŒä¸€ä¸ªå†…å˜ï¼Œå› æ¤åˆ 除一个就完全ç‰åŒäºŽåˆ 除å¦ä¸€ä¸ªã€‚æ¢å¥è¯è¯´ï¼Œåˆ é™¤ä¸¤è€…ä¸Žåˆ é™¤å…¶ä¸ä¸€ä¸ªç›¸åŒ - 这显然是错误的。