当你å°è¯•é‡Šæ”¾ï¼ˆï¼‰å·²ç»é‡Šæ”¾c中的内存时会å‘生什么?

时间:2008-09-25 19:32:21

标签: c memory memory-management

例如:

char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
free(myString);
free(myString);

这样åšæ˜¯å¦æœ‰ä»»ä½•ä¸è‰¯å‰¯ä½œç”¨ï¼Ÿ

14 个答案:

答案 0 :(得分:34)

这是章节和ç»æ–‡ã€‚

  

如果[free函数]çš„å‚数与先å‰calloc,malloc返回的指针ä¸åŒ¹é…,或者   realloc功能,或者如果通过调用free或reallocå–消分é…空间,   行为未定义。 (ISO 9899:1999 - Programming languages — C,第7.20.3.2节)

答案 1 :(得分:18)

无所ä¸çŸ¥ï¼Œæ— å£°å†…å­˜æŸå或分段错误。

答案 2 :(得分:14)

是的,您å¯ä»¥èŽ·å¾—导致程åºå´©æºƒçš„åŒé‡å…费错误。它与malloc的内部数æ®ç»“构有关,以跟踪分é…的内存。

答案 3 :(得分:8)

答案摘è¦ï¼š

是的,å事å¯èƒ½ä¹Ÿå¯èƒ½ä¼šå‘生。

为了防止这ç§æƒ…况:

free(myString);
myString = NULL;

请注æ„,如果创建了其他内容,则必须将对内存的所有引用设置为NULL。

å¦å¤–,使用free()调用NULL会导致无法执行æ“作。有关详细信æ¯ï¼Œè¯·å‚阅:man free

答案 4 :(得分:6)

ä¸é‚£ä¹ˆèªæ˜Žã€‚è°·æ­Œæä¾›åŒé‡å…è´¹æ¼æ´žã€‚在释放åŽå°†æŒ‡é’ˆè®¾ç½®ä¸ºNULL以é¿å…此类错误。

答案 5 :(得分:4)

æ ¹æ®æ‚¨è¿è¡Œå®ƒçš„系统,ä¸ä¼šå‘生任何事情,程åºå°†å´©æºƒï¼Œå†…存将被破å或任何其他有趣的效果。

答案 6 :(得分:3)

释放åŽå§‹ç»ˆå°†æŒ‡é’ˆè®¾ç½®ä¸ºNULL。 å°è¯•é‡Šæ”¾ç©ºæŒ‡é’ˆæ˜¯å®‰å…¨çš„。

值得编写自己的å…费包装器æ¥è‡ªåŠ¨æ‰§è¡Œæ­¤æ“作。

答案 7 :(得分:3)

它(å¯èƒ½ï¼‰ä½¿demons fly out of your nose。

答案 8 :(得分:2)

ä¸è¦é‚£æ ·åšã€‚如果释放的内存在free的调用之间被é‡æ–°åˆ†é…给其他东西,那么事情就会æžç ¸äº†ã€‚

答案 9 :(得分:2)

糟糕的事情(TM)

真的,我认为它是未定义的,所以包括与NORAD的大型机一起玩“全çƒçƒ­æ ¸æˆ˜äº‰â€

答案 10 :(得分:1)

它å¯èƒ½ä¼šå¯¼è‡´ç¨‹åºå´©æºƒï¼Œå†…å­˜æŸå或其他更微妙的负é¢å½±å“。删除内存åŽï¼Œæœ€å¥½å°†å…¶è®¾ç½®ä¸ºNULL(0)。å°è¯•é‡Šæ”¾ç©ºæŒ‡é’ˆä»€ä¹ˆéƒ½ä¸åšï¼Œå¹¶ä¿è¯æ˜¯å®‰å…¨çš„。对于c ++中的删除也是如此。

答案 11 :(得分:1)

简而言之:“未定义的行为â€ã€‚

(现在,这å¯ä»¥åŒ…括什么以åŠå…¶ä»–人已ç»è¯´è¿‡çš„原因。我åªæ˜¯å€¼å¾—一æ这里的术语,因为它很常è§ï¼‰ã€‚

答案 12 :(得分:1)

下é¢å…¬è®¤çš„奇怪的å®æ˜¯ä¸€ä¸ªæœ‰ç”¨çš„替代å“,å¯ä»¥æ¶ˆé™¤å‡ ç±»å®‰å…¨æ¼æ´žå¹¶å¸®åŠ©è°ƒè¯•ï¼Œå› ä¸ºè®¿é—®free()区域更容易å‘生段错误而ä¸æ˜¯æ— å£°åœ°ç ´å内存。 / p>

#define my_free(x) do { free(x); x = NULL; } while (0)

do-while循环是为了帮助周围的代ç æ›´å®¹æ˜“地消化多个语å¥ã€‚例如if(done)my_free(x);

答案 13 :(得分:-1)

å¦ä¸€ä¸ªæœ‰è¶£çš„情况:

char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
char * yourString = myString;

if (myString)
{
    free(myString);
    myString = NULL;
}
// Now this one is safe, because we keep to the rule for 
// setting pointers to NULL after deletion ...
if (myString)
{
    free(myString);
    myString = NULL;
}

// But what about this one:
if (yourString)
{
    free(yourString);
    yourString = NULL;
}

//?!? :)