勇芳软件工作室.汉化:  SQLite3 API Functions > Memory Allocation >

sqlite3_realloc

Previous pageReturn to chapter overviewNext page

描述

 

SQLite核心sqlite3_mallocsqlite3_reallocsqlite3_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_mallocsqlite3_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_freesqlite3_realloc的指针参数必须为NULL,否则从先前调用sqlite3_mallocsqlite3_realloc获取的指针尚未发布。

 

应用程序在使用sqlite3_freesqlite3_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);

}