picox  0.1
Xstdlib

主にmalloc系の機能を提供します [詳解]

Xstdlib 連携図

マクロ定義

#define X_SAFE_FREE(ptr)   (x_free((ptr)), (ptr) = NULL)
 x_free()を呼び出したあと、ptrにNULLを代入します [詳解]
 

関数

static void * x_calloc (size_t nmemb, size_t size)
 sizeバイトの要素nmemb個からなる配列にメモリを割り当て0初期化して返します
 
static void * x_calloc2 (size_t size)
 sizeバイトのメモリを割り当て、0初期化して返します [詳解]
 
static void x_free (void *ptr)
 ptrが指すメモリ空間を開放します
 
static void * x_malloc (size_t size)
 sizeバイトのメモリを割り当てて返します
 
static void * x_realloc (void *old_mem, size_t size)
 old_memが指すメモリブロックをsizeバイトに再割当てして返します
 
static void * x_realloc2 (void *old_mem, size_t old_size, size_t new_size)
 old_memが指すold_sizeバイトのメモリブロックをnew_sizeバイトに再割当てして返します [詳解]
 

詳解

主にmalloc系の機能を提供します

マクロ定義詳解

#define X_SAFE_FREE (   ptr)    (x_free((ptr)), (ptr) = NULL)

x_free()を呼び出したあと、ptrにNULLを代入します

無効なポインタの不正使用によるバグは、C言語で最も避けたいわかりづらいバグの 一つです。開放したポインタにはNULLをセットしておいて不正使用時は即死するよう にしておくのは良い習慣です。

関数詳解

static void* x_calloc2 ( size_t  size)
inlinestatic

sizeバイトのメモリを割り当て、0初期化して返します

calloc()のaバイトの要素b個割り当てるというインターフェースは、内部実装によっ ては最適化の恩恵があるのだと思いますが、picoxの実装としては何も意味がないの で、単に0初期化した動的メモリ確保を行いたいだけなら、こちらの方がシンプルで す。

static void* x_realloc2 ( void *  old_mem,
size_t  old_size,
size_t  new_size 
)
inlinestatic

old_memが指すold_sizeバイトのメモリブロックをnew_sizeバイトに再割当てして返します

mallocを直接実装している場合は、old_memのポインタから、直接old_sizeを取り出 すことができますが、そうではない場合サイズを取得することができないため、無駄 なコピーが必要になる場合があります。

普通、メモリの再割当てを行う場合、元のサイズは呼び出し側がわかっていることが 多いため、引数として渡してもらうことで無駄なコピーを防ぎます。