void doSomething()
{
TheObject *ptr = new TheObject;
delete ptr;
ptr = NULL;
return 0;
}
让我借用cplusplus.comä¸operator deleteçš„å—æ ·ï¼š
 Â释放由ptr指å‘的内å˜å—(如果ä¸ä¸ºnull)   先å‰é€šè¿‡è°ƒç”¨operator new分é…给它的å˜å‚¨ç©ºé—´   并使该指针ä½ç½®æ— 效。
è¯·å¸®åŠ©æ¸…é™¤æˆ‘çš„å›°æƒ‘ï¼šåˆ é™¤åŽæŒ‡é’ˆæœ¬èº«ä¼šå‘生什么?指针本身确实有一个地å€ï¼Œå¯¹å—ï¼Ÿæ‰€ä»¥åœ¨åˆ é™¤æŒ‡å‘çš„å—åŽï¼ŒæŒ‡é’ˆæœ¬èº«å‘¢ï¼Ÿ
我å¯ä»¥è¯´åœ¨è¿”回åˆå§‹åŒ–指针的方法åŽæŒ‡é’ˆæœ¬èº«ä¼šè‡ªç”±å—ï¼ŸæŒ‡é’ˆæœ¬èº«æ˜¯æ”¾åœ¨å †æ ˆè¿˜æ˜¯å †ä¸Šï¼Ÿ
ç”案 0 :(得分:20)
指针本身确实有一个地å€å’Œå€¼ã€‚对其执行delete
åŽï¼ŒæŒ‡é’ˆçš„地å€ä¸ä¼šæ”¹å˜ã€‚分é…给指针å˜é‡æœ¬èº«çš„空间ä¿æŒä¸å˜ï¼Œç›´åˆ°ç¨‹åºé‡Šæ”¾å®ƒï¼ˆå®ƒå¯èƒ½æ°¸è¿œä¸ä¼šå‘生,例如当指针ä½äºŽé™æ€å˜å‚¨åŒºåŸŸæ—¶ï¼‰ã€‚æ ‡å‡†æ²¡æœ‰è¯´æ˜ŽæŒ‡é’ˆçš„å€¼ä¼šå‘生什么å˜åŒ–;它说的是,在为指针指定有效值之å‰ï¼Œä¸å†å…许使用该值。指针的这ç§çŠ¶æ€ç§°ä¸ºæ‚¬ç©ºã€‚
在您的程åºä¸ï¼ŒæŒ‡é’ˆptr
在delete
完æˆåŽï¼Œä½†åœ¨æ‰§è¡Œptr = NULL
分é…之å‰æ‚¬ç©ºã€‚之åŽå®ƒå˜æˆNULL
指针。
 Âå®ƒè‡ªå·±çš„æŒ‡é’ˆæ”¾åœ¨å †æ ˆè¿˜æ˜¯å †ä¸Šï¼Ÿ
指针å˜é‡æ˜¯ä¸€ä¸ªå¸¸è§„å˜é‡ã€‚它的ä½ç½®éµå¾ªä¸Žå…¶ä»–å˜é‡çš„放置相åŒçš„规则,å³æ‚¨å¯ä»¥å°†æŒ‡é’ˆæ”¾åœ¨é™æ€åŒºåŸŸï¼Œè‡ªåŠ¨åŒºåŸŸï¼ˆé€šå¸¸ç§°ä¸ºâ€œå †æ ˆâ€ï¼‰æˆ–动æ€å†…å˜ï¼ˆä¹Ÿç§°ä¸ºâ€œå †â€ï¼‰ä¸ï¼‰ã€‚在这ç§æƒ…况下,您将指定一个指针指针:
TheObject **ptrPtr = new TheObject*; // The pointer to a pointer is on the stack
*ptrPtr = new TheObject; // The pointer to TheObject is in the heap
delete *ptrPtr; // The space for TheObject is released; the space for the pointer to TheObject is not
delete ptrPtr; // Now the space for the pointer to TheObject is released as well
// The space for the pointer to pointer gets released when ptrPtr goes out of scope
ç”案 1 :(得分:2)
在Cå’ŒC ++ä¸ï¼ŒæŒ‡é’ˆå¯ä»¥åœ¨å¾ˆå¤šæ–¹é¢è¢«è®¤ä¸ºåªæ˜¯ä¸€ä¸ªä¼ªè£…çš„æ•´æ•°ã€‚æ‰€ä»¥å½“ä½ è¯´ï¼š
TheObject *ptr = new TheObject;
然åŽptr
å°±åƒä¸€ä¸ªå †æ ˆåˆ†é…(“自动â€ï¼‰æ•´æ•°å˜é‡ï¼Œä¸€ä¸ªæ°å¥½å¤§åˆ°è¶³ä»¥ä¿å˜å †åˆ†é…TheObject
的内å˜åœ°å€ã€‚它类似于说
size_t i = /* some value given to you by the runtime */.
ç¨åŽï¼Œå½“ä½ å†™
ptr = NULL;
它的å«ä¹‰ç›¸åŒï¼š
i = 0;
那么离开函数时指针会å‘生什么?就åƒä»»ä½•å…¶ä»–自动å˜é‡ä¸€æ ·ï¼Œå®ƒåœ¨å—的末尾被释放。就这么简å•ã€‚ (当然,指å‘的东西会继ç»å˜åœ¨ï¼Œç›´åˆ°ä½ 在Cä¸è°ƒç”¨delete
或free()
。
ç”案 2 :(得分:1)
执行delete
ä½¿æŒ‡é’ˆæ— æ•ˆï¼ˆè¯·å‚阅[new.delete.single]#10
)。å¯ä»¥è¯´å€¼å·²æ›´æ”¹ï¼šä¹‹å‰å®ƒæœ‰ä¸€ä¸ªå€¼ï¼Œä½†çŽ°åœ¨å®ƒæ²¡æœ‰å€¼ã€‚
å°è¯•è¯»å–指针的值(注æ„:这与解除引用它ä¸åŒï¼‰ä¼šå¯¼è‡´å®žçŽ°å®šä¹‰çš„è¡Œä¸ºï¼Œå› ä¸ºC ++ 14å¯èƒ½åŒ…括生æˆè¿è¡Œæ—¶é”™è¯¯ã€‚ (在C ++ 11å’Œæ›´æ—©çš„æ ‡å‡†ä¸ï¼Œå®ƒæ˜¯æœªå®šä¹‰çš„行为)。å‚考:[basic.stc.dynamic.deallocation]#4
。
编译器也å¯ä»¥å°†æŒ‡é’ˆè®¾ç½®ä¸ºnull,或将其设置为æŸäº›å¯è¯†åˆ«çš„垃圾以进行调试(尽管我ä¸çŸ¥é“有任何编译器执行æ¤æ“作)。