名稱空間
變體
操作

free

來自 cppreference.com
< c‎ | 記憶體
在標頭檔案 <stdlib.h> 中定義
void free( void *ptr );

釋放先前由 malloc()calloc()aligned_alloc()(C11 起)realloc() 分配的空間。

如果 ptr 是空指標,則函式不做任何事情。

如果 ptr 的值不等於之前由 malloc()calloc()realloc()aligned_alloc()(C11 起) 返回的值,則行為未定義。

如果 ptr 所指的記憶體區域已經被釋放,即 free()free_sized()free_aligned_sized()(C23 起)realloc() 已經以 ptr 作為引數被呼叫,並且之後沒有呼叫 malloc()calloc()realloc()aligned_alloc()(C11 起) 導致返回與 ptr 相等的指標,則行為未定義。

如果在 free() 返回後透過指標 ptr 進行訪問,則行為未定義(除非另一個分配函式恰好返回了與 ptr 相等的指標值)。

free 是執行緒安全的:它的行為就像只訪問透過其引數可見的記憶體位置,而不訪問任何靜態儲存。

free 的呼叫會釋放一個記憶體區域,這與對任何後續分配相同或部分相同記憶體區域的分配函式的呼叫“同步”。這種同步發生在釋放函式訪問記憶體之後,以及分配函式訪問記憶體之前。對於在每個特定記憶體區域上操作的所有分配和釋放函式,存在一個單一的總順序。

(C11 起)

目錄

[編輯] 引數

ptr - 指向要解除分配的記憶體的指標

[編輯] 返回值

(無)

[編輯] 注意

函式接受空指標(並對其不做任何操作),以減少特殊情況處理。無論分配是否成功,分配函式返回的指標都可以傳遞給 free()

[編輯] 示例

#include <stdlib.h>
 
int main(void)
{
    int *p1 = malloc(10*sizeof *p1);
    free(p1); // every allocated pointer must be freed
 
    int *p2 = calloc(10, sizeof *p2);
    int *p3 = realloc(p2, 1000*sizeof *p3);
    if(p3) // p3 not null means p2 was freed by realloc
       free(p3);
    else // p3 null means p2 was not freed
       free(p2);
}

[編輯] 參考

  • C23 標準 (ISO/IEC 9899:2024)
  • 7.24.3.3 free 函式 (p: 365)
  • C17 標準 (ISO/IEC 9899:2018)
  • 7.22.3.3 free 函式 (p: 254)
  • C11 標準 (ISO/IEC 9899:2011)
  • 7.22.3.3 free 函式 (p: 348)
  • C99 標準 (ISO/IEC 9899:1999)
  • 7.20.3.2 free 函式 (p: 313)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 4.10.3.2 free 函式

[編輯] 另請參閱

分配記憶體
(函式) [編輯]
釋放之前分配的指定大小的記憶體
(函式) [編輯]
釋放之前分配的指定大小且對齊的記憶體
(函式) [編輯]