void *sqlite3_malloc(int); void *sqlite3_malloc64(sqlite3_uint64); void *sqlite3_realloc(void*, int); void *sqlite3_realloc64(void*, sqlite3_uint64); void sqlite3_free(void*); sqlite3_uint64 sqlite3_msize(void*);
SQLite 核心使用這三個例程來滿足其所有內部記憶體配置需求。前一句中的「核心」不包含作業系統特定的 虛擬檔案系統 (VFS) 實作。Windows VFS 在某些操作中使用原生 malloc() 和 free()。
sqlite3_malloc() 例程會返回一個指向至少 N 個位元組的記憶體區塊的指標,其中 N 是參數。如果 sqlite3_malloc() 無法取得足夠的可用記憶體,它會返回 NULL 指標。如果 sqlite3_malloc() 的參數 N 為零或負數,則 sqlite3_malloc() 會返回 NULL 指標。
sqlite3_malloc64(N) 例程的工作方式與 sqlite3_malloc(N) 相同,只是 N 是一個無號 64 位元整數,而不是有號 32 位元整數。
使用先前由 sqlite3_malloc() 或 sqlite3_realloc() 返回的指標呼叫 sqlite3_free() 會釋放該記憶體,以便可以重複使用。如果使用 NULL 指標呼叫 sqlite3_free() 例程,則它是不進行任何操作。將 NULL 指標傳遞給 sqlite3_free() 是無害的。釋放後,不應讀取或寫入記憶體。即使讀取先前釋放的記憶體也可能導致區段錯誤或其他嚴重錯誤。如果使用非 NULL 指標呼叫 sqlite3_free(),而該指標不是從 sqlite3_malloc() 或 sqlite3_realloc() 取得的,則可能導致記憶體損毀、區段錯誤或其他嚴重錯誤。
sqlite3_realloc(X,N) 介面會嘗試將先前的記憶體配置 X 調整為至少 N 個位元組。如果 sqlite3_realloc(X,N) 的 X 參數是 NULL 指標,則其行為與呼叫 sqlite3_malloc(N) 相同。如果 sqlite3_realloc(X,N) 的 N 參數為零或負數,則其行為與呼叫 sqlite3_free(X) 完全相同。sqlite3_realloc(X,N) 返回一個指向大小至少為 N 個位元組的記憶體配置的指標,如果可用記憶體不足,則返回 NULL。如果 M 是先前配置的大小,則先前配置的 min(N,M) 個位元組會複製到 sqlite3_realloc(X,N) 返回的緩衝區的開頭,並釋放先前配置。如果 sqlite3_realloc(X,N) 返回 NULL 且 N 為正數,則不會釋放先前配置。
sqlite3_realloc64(X,N) 介面的工作方式與 sqlite3_realloc(X,N) 相同,只是 N 是一個 64 位元無號整數,而不是 32 位元有號整數。
如果 X 是先前從 sqlite3_malloc()、sqlite3_malloc64()、sqlite3_realloc() 或 sqlite3_realloc64() 取得的記憶體配置,則 sqlite3_msize(X) 會以位元組為單位返回該記憶體配置的大小。sqlite3_msize(X) 返回的值可能大於配置 X 時請求的位元組數。如果 X 是 NULL 指標,則 sqlite3_msize(X) 返回零。如果 X 指向的不是記憶體配置的開頭,或者它指向先前有效的但現在已釋放的記憶體配置,則 sqlite3_msize(X) 的行為未定義,並且可能是有害的。
sqlite3_malloc()、sqlite3_realloc()、sqlite3_malloc64() 和 sqlite3_realloc64() 返回的記憶體始終至少對齊到 8 位元組邊界,或者如果使用 SQLITE_4_BYTE_ALIGNED_MALLOC 編譯時選項,則對齊到 4 位元組邊界。
sqlite3_free() 和 sqlite3_realloc() 的指標參數必須是 NULL,或者是由先前呼叫 sqlite3_malloc() 或 sqlite3_realloc() 取得且尚未釋放的指標。
應用程式不得在使用 sqlite3_free() 或 sqlite3_realloc() 釋放記憶體區塊後讀取或寫入該區塊的任何部分。