例如:
char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
free(myString);
free(myString);
è¿™æ ·åšæ˜¯å¦æœ‰ä»»ä½•ä¸è‰¯å‰¯ä½œç”¨ï¼Ÿ
ç”案 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;
}
//?!? :)