描述
SQLite核心sqlite3_malloc,sqlite3_realloc和sqlite3_free的所有内部内存分配需求。前一句中的“核心”不包括操作系统特定的VFS实现。Windows VFS使用原生的malloc和自由进行某些操作。
sqlite3_remalloc功能尝试将先前的内存分配调整为至少N个字节,其中N是第二个参数。要调整大小的内存分配是第一个参数。
C / C ++语法
void *sqlite3_realloc(void*, int); |
PB语法
FUNCTION sqlite3_realloc ( _ BYVAL pMem AS DWORD, _ BYVAL numBytes AS LONG _ ) AS DWORD |
参数
pMem
[in]由sqlite3_malloc分配的内存指针。
numBytes
[in]要重新分配的字节数。
返回值
指向重新分配的内存的指针。
备注
如果使用SQLITE_4_BYTE_ALIGNED_MALLOC编译时选项,则sqlite3_malloc和sqlite3_realloc返回的内存总是对齐至少8个字节的边界,或4字节的边界。
在SQLite版本3.5.0和3.5.1中,可以定义SQLITE_OMIT_MEMORY_ALLOCATION,这将导致这些功能的内置实现被省略。该函数不再提供。只能使用内置内存分配器。
在SQLite版本3.7.10之前,在由SQLite使用的UTF-8编码和任何文件名编码之间转换文件名时,直接称为系统的malloc和自由的Windows操作系统界面层由特定的Windows安装使用。检测到内存分配错误,但是它们已报告为SQLITE_CANTOPEN或SQLITE_IOERR,而不是SQLITE_NOMEM。
sqlite3_free和sqlite3_realloc的指针参数必须为NULL,否则从先前调用sqlite3_malloc或sqlite3_realloc获取的指针尚未发布。
应用程序在使用sqlite3_free或sqlite3_realloc发布后,不得读取或写入内存块的任何部分。
C ++实现代码
/*
** Change the size of an existing memory allocation
*/
SQLITE_PRIVATE void *sqlite3Realloc(void *pOld, int nBytes){
int nOld, nNew, nDiff;
void *pNew;
if( pOld==0 ){
return sqlite3Malloc(nBytes); /* IMP: R-28354-25769 */
}
if( nBytes<=0 ){
sqlite3_free(pOld); /* IMP: R-31593-10574 */
return 0;
}
if( nBytes>=0x7fffff00 ){
/* The 0x7ffff00 limit term is explained in comments on sqlite3Malloc() */
return 0;
}
nOld = sqlite3MallocSize(pOld);
/* IMPLEMENTATION-OF: R-46199-30249 SQLite guarantees that the second
** argument to xRealloc is always a value returned by a prior call to
** xRoundup. */
nNew = sqlite3GlobalConfig.m.xRoundup(nBytes);
if( nOld==nNew ){
pNew = pOld;
}else if( sqlite3GlobalConfig.bMemstat ){
sqlite3_mutex_enter(mem0.mutex);
sqlite3StatusSet(SQLITE_STATUS_MALLOC_SIZE, nBytes);
nDiff = nNew - nOld;
if( sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED) >=
mem0.alarmThreshold-nDiff ){
sqlite3MallocAlarm(nDiff);
}
assert( sqlite3MemdebugHasType(pOld, MEMTYPE_HEAP) );
assert( sqlite3MemdebugNoType(pOld, ~MEMTYPE_HEAP) );
pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew);
if( pNew==0 && mem0.alarmCallback ){
sqlite3MallocAlarm(nBytes);
pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew);
}
if( pNew ){
nNew = sqlite3MallocSize(pNew);
sqlite3StatusAdd(SQLITE_STATUS_MEMORY_USED, nNew-nOld);
}
sqlite3_mutex_leave(mem0.mutex);
}else{
pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew);
}
assert( EIGHT_BYTE_ALIGNMENT(pNew) ); /* IMP: R-04675-44850 */
return pNew;
}
/*
** The public interface to sqlite3Realloc. Make sure that the memory
** subsystem is initialized prior to invoking sqliteRealloc.
*/
SQLITE_API void *sqlite3_realloc(void *pOld, int n){
#ifndef SQLITE_OMIT_AUTOINIT
if( sqlite3_initialize() ) return 0;
#endif
return sqlite3Realloc(pOld, n);
}