删除åŽæŒ‡é’ˆæœ¬èº«ä¼šå‘生什么?

时间:2014-05-13 01:59:53

标签: c++ pointers

void doSomething()
{  
    TheObject *ptr = new TheObject;
    delete ptr;
    ptr = NULL;
    return 0;
}

让我借用cplusplus.com中operator delete的字样:

  

释放由ptr指å‘的内存å—(如果ä¸ä¸ºnull)   先å‰é€šè¿‡è°ƒç”¨operator new分é…给它的存储空间   并使该指针ä½ç½®æ— æ•ˆã€‚

请帮助清除我的困惑:删除åŽæŒ‡é’ˆæœ¬èº«ä¼šå‘生什么?指针本身确实有一个地å€ï¼Œå¯¹å—?所以在删除指å‘çš„å—åŽï¼ŒæŒ‡é’ˆæœ¬èº«å‘¢ï¼Ÿ

我å¯ä»¥è¯´åœ¨è¿”回åˆå§‹åŒ–指针的方法åŽæŒ‡é’ˆæœ¬èº«ä¼šè‡ªç”±å—?指针本身是放在堆栈还是堆上?

3 个答案:

答案 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,或将其设置为æŸäº›å¯è¯†åˆ«çš„垃圾以进行调试(尽管我ä¸çŸ¥é“有任何编译器执行此æ“作)。