Glib学习(19) 内存分配 Memory Allocation

glib源码下载:http://ftp.gnome.org/pub/gnome/sources/glib/
glib帮助文档:https://developer.gnome.org/glib/

本节主要讲解一下Memory Allocation函数,基本就是linux系统函数的封装,我把函数使用谷歌翻译了一下,没有仔细校验,因为英语是在太差,而且函数基本差不多,懂了一个就能举一反三。基本都是实际使用的函数,就不提供例程了。

Includes
#include <glib.h>

描述

这些函数支持分配和释放内存。
如果任何分配内存的调用失败,则终止应用程序。 这也意味着无需检查调用是否成功。
将g_malloc()(包括封装为 g_new())与g_free()匹配很重要,g_slice_alloc()(包括封装为 g_slice_new())与g_slice_free(),普通malloc()与free(),(如果你使用的是C ++)new 与 delete和new [] 与 delete []。否则会发生不好的事情,因为这些分配器可能使用不同的内存池(而且new / delete调用构造函数和析构函数)。

函数

g_new()

#define             g_new(struct_type, n_structs)
分配类型为struct_type的n_structs元素。 返回的指针被强制转换为指向给定类型的指针。 如果n_structs为0,则返回NULL。 在计算分配块的大小时,要注意避免溢出。
由于返回的指针已经被转换为正确的类型,因此通常不需要显式地转换它,这样做可能会隐藏内存分配错误。
参数
struct_type
要分配的元素的类型
n_structs
要分配的元素数量
返回值
指向已分配内存的指针,强制转换为指向struct_type的指针

g_new0()
#define             g_new0(struct_type, n_structs)
分配n_structs类型为struct_type的元素,初始化为0。 返回的指针被强制转换为指向给定类型的指针。 如果n_structs为0,则返回NULL。 在计算分配块的大小时,要注意避免溢出。
由于返回的指针已经被转换为正确的类型,因此通常不需要显式地转换它,这样做可能会隐藏内存分配错误。
参数
struct_type
要分配的元素的类型。
n_structs
要分配的元素数量。
返回值
指向已分配内存的指针,强制转换为指向struct_type的指针。

g_renew()
#define             g_renew(struct_type, mem, n_structs)
重新分配mem指向的内存,以便它现在为n_structs类型为struct_type的元素提供空间。 它返回可能已被移动的内存的新地址。 在计算分配块的大小时,要注意避免溢出。
参数
struct_type
要分配的元素的类型
mem
当前分配的内存
n_structs
要分配的元素数量
返回值
指向新分配的内存的指针,强制转换为指向struct_type的指针

g_try_new()
#define             g_try_new(struct_type, n_structs)
尝试分配struct_type类型的n_structs元素,并在失败时返回NULL。 与g_new()对比,g_new()在失败时中止程序。 返回的指针被强制转换为指向给定类型的指针。 如果发生溢出,则n_structs为0时,该函数返回NULL。
参数
struct_type
要分配的元素的类型
n_structs
要分配的元素数量
返回值
指向新分配的内存的指针,强制转换为指向struct_type的指针

g_try_new0()
#define             g_try_new0(struct_type, n_structs)
尝试分配struct_type类型的n_structs元素,初始化为0,并在失败时返回NULL。 与g_new0()对比,g_new0()在失败时中止程序。 返回的指针被强制转换为指向给定类型的指针。 当n_structs为0或发生溢出时,该函数返回NULL。
参数
struct_type
要分配的元素的类型
n_structs
要分配的元素数量
返回值
指向新分配的内存的指针,强制转换为指向struct_type的指针

g_try_renew()
#define             g_try_renew(struct_type, mem, n_structs)
尝试重新分配mem指向的内存,以便它现在为n_structs类型为struct_type的元素提供空间,并在失败时返回NULL。 与g_renew()对比,它在失败时中止程序。 它返回可能已被移动的内存的新地址。 如果发生溢出,该函数返回NULL。
参数
struct_type
要分配的元素的类型
mem
当前分配的内存
n_structs
要分配的元素数量
返回值
指向新分配的内存的指针,强制转换为指向struct_type的指针

g_malloc ()
gpointer
g_malloc (gsize n_bytes);
分配n_bytes个字节的内存。 如果n_bytes为0,则返回NULL。
参数
n_bytes
要分配的字节数
返回值
当前分配的内存
g_malloc0 ()
gpointer
g_malloc0 (gsize n_bytes);
分配n_bytes个字节的内存,初始化为0。 如果n_bytes为0,则返回NULL。
参数
n_bytes
要分配的字节数
返回值
指向已分配内存的指针

g_realloc ()
gpointer
g_realloc (gpointer mem,
           gsize n_bytes);
重新分配mem指向的内存,以便它现在有n_bytes字节的内存空间。 它返回可能已被移动的内存的新地址。 mem可能为NULL,在这种情况下,它被认为是零长度。 n_bytes可能为0,在这种情况下,将返回NULL并释放mem,除非它为NULL。
参数
mem
要重新分配的内存。
[nullable]
n_bytes
新的内存大小(以字节为单位)
返回值
已分配内存的新地址

g_try_malloc ()
gpointer
g_try_malloc (gsize n_bytes);
尝试分配n_bytes,并在失败时返回NULL。 与g_malloc()对比,后者在失败时中止程序。
参数
n_bytes
要分配的字节数。
返回值
分配的内存,或NULL。

g_try_malloc0 ()
gpointer
g_try_malloc0 (gsize n_bytes);
尝试分配n_bytes,初始化为0,并在失败时返回NULL。 与g_malloc0()对比,后者在失败时中止程序。
参数
n_bytes
要分配的字节数。
返回值
分配的内存,或NULL。

g_try_realloc ()
gpointer
g_try_realloc (gpointer mem,
               gsize n_bytes);
尝试将mem重新分配给新大小n_bytes,并在失败时返回NULL。 与g_realloc()对比,它在失败时中止程序。
如果mem为NULL,则行为与g_try_malloc()相同。
参数
mem
先前分配的内存,或NULL。
[nullable]
n_bytes
要分配的字节数。
返回值
分配的内存,或NULL。

g_malloc_n ()
gpointer
g_malloc_n (gsize n_blocks,
            gsize n_block_bytes);
此函数类似于g_malloc(),分配(n_blocks * n_block_bytes)个字节,但要注意检测乘法期间可能的溢出。
参数
n_blocks
要分配的块数
n_block_bytes
每个块的大小(以字节为单位)
返回值
指向已分配内存的指针

g_malloc0_n ()
gpointer
g_malloc0_n (gsize n_blocks,
             gsize n_block_bytes);
此函数类似于g_malloc0(),分配(n_blocks * n_block_bytes)字节,但要注意检测乘法期间可能的溢出。
参数
n_blocks
要分配的块数
n_block_bytes
每个块的大小(以字节为单位)
返回值
指向已分配内存的指针

g_realloc_n ()
gpointer
g_realloc_n (gpointer mem,
             gsize n_blocks,
             gsize n_block_bytes);
此函数类似于g_realloc(),分配(n_blocks * n_block_bytes)字节,但要注意检测乘法期间可能的溢出。
参数
mem
要重新分配的内存。
[nullable]
n_blocks
要分配的块数
n_block_bytes
每个块的大小(以字节为单位)
返回值
已分配内存的新地址

g_try_malloc_n ()
gpointer
g_try_malloc_n (gsize n_blocks,
                gsize n_block_bytes);
此函数类似于g_try_malloc(),分配(n_blocks * n_block_bytes)个字节,但要注意检测乘法期间可能的溢出。
参数
n_blocks
要分配的块数
n_block_bytes
每个块的大小(以字节为单位)
返回值
分配的内存,或NULL。

g_try_malloc0_n ()
gpointer
g_try_malloc0_n (gsize n_blocks,
                 gsize n_block_bytes);
此函数类似于g_try_malloc0(),分配(n_blocks * n_block_bytes)个字节,但要注意检测乘法期间可能的溢出。
参数
n_blocks
要分配的块数
n_block_bytes
每个块的大小(以字节为单位)
返回值
分配的内存,或NULL

g_try_realloc_n ()
gpointer
g_try_realloc_n (gpointer mem,
                 gsize n_blocks,
                 gsize n_block_bytes);
此函数类似于g_try_realloc(),分配(n_blocks * n_block_bytes)个字节,但要注意检测乘法期间可能的溢出。
参数
mem
先前分配的内存,或NULL。
[nullable]
n_blocks
要分配的块数
n_block_bytes
每个块的大小(以字节为单位)
返回值
分配的内存,或NULL。

g_free ()
void
g_free (gpointer mem);
释放mem指向的内存。
如果mem为NULL,则它只返回,因此在调用此函数之前无需检查mem对NULL。
参数
mem
要释放的记忆。
[nullable]
g_clear_pointer ()
void
g_clear_pointer (gpointer *pp,
                 GDestroyNotify destroy);
清除对变量的引用。
pp不能为NULL。
如果引用为NULL,则此函数不执行任何操作。 否则,使用destroy销毁变量,并将指针设置为NULL。
还包括一个宏,允许在没有指针强制转换的情况下使用此函数。
[skip]

参数
pp
指向保存指针的变量,结构成员等的指针。
[not nullable]
destroy
可以传递gpointer的函数,以销毁* ppg_steal_pointer ()
gpointer
g_steal_pointer (gpointer pp);
将pp设置为NULL,返回之前的值。
从概念上讲,这将指针的所有权从引用的变量转移到宏的“调用者”(即:“窃取”引用)。
根据pp的类型,将正确键入返回值。
当与g_autoptr()结合使用时,这可以非常有用,以防止自动释放函数的返回值。 考虑以下示例(仅适用于GCC和clang):

GObject *
create_object (void)
{
  g_autoptr(GObject) obj = g_object_new (G_TYPE_OBJECT, NULL);

  if (early_error_case)
    return NULL;

  return g_steal_pointer (&obj);
}


它也可以以类似的方式用于'out'参数,对于处理可选的out参数特别有用:

gboolean
get_object (GObject **obj_out)
{
  g_autoptr(GObject) obj = g_object_new (G_TYPE_OBJECT, NULL);

  if (early_error_case)
    return FALSE;

  if (obj_out)
    *obj_out = g_steal_pointer (&obj);

  return TRUE;
}


在上面的示例中,对象将在早期错误情况下自动释放,并且在为obj_out指定NULL的情况下也会自动释放。
参数
pp
指向指针的指针。
[not nullable]

g_alloca()
#define             g_alloca(size)
在堆栈上分配大小字节; 清除当前堆栈帧时将释放这些字节。 这个宏基本上只包含大多数UNIX变种上存在的alloca()函数。 因此它提供了与alloca()相同的优点和缺陷:
alloca()速度非常快,因为在大多数系统中,它只需调整堆栈指针寄存器即可实现。
它不会导致任何内存碎片,在其范围内,单独的alloca()块只是构建并在函数端一起释放。
分配大小必须适合当前的堆栈帧。 例如,在Linux上的线程环境中,每线程堆栈大小限制为2兆字节,因此使用alloca()时需要注意大小。
由于堆栈空间不足而导致的分配失败不会像NULL返回那样表示,例如 使用malloc()。 相反,大多数系统可能以与无限函数递归的堆栈空间情况相同的方式处理它,即具有分段错误。
将alloca()与GNU C变量大小的数组混合时,必须特别小心。 在与可变大小的数组相同的范围内使用alloca()分配的堆栈空间将在退出该作用域时与可变大小的数组一起释放,而不是在封闭的函数作用域退出时释放。
参数
size
要分配的字节数。
返回值
用于大小字节的空间,在堆栈上分配

g_newa()
#define             g_newa(struct_type, n_structs)
以更安全的方式包装g_alloca()。
参数
struct_type
要分配的内存块类型
n_structs
要分配的块数
返回值
指向n_structs struct_type类型的块的堆栈空间的指针

g_memmove()
#define             g_memmove(dest,src,len)
g_memmove自版本2.40起已被弃用,不应在新编写的代码中使用。

g_memdup ()
gpointer
g_memdup (gconstpointer mem,
          guint byte_size);
分配内存的byte_size字节,并将mem_s中的byte_size字节复制到其中。 如果mem为NULL,则返回NULL。
参数
mem
要复制的内存。
byte_size
要复制的字节数。
返回值
指向新分配的内存副本的指针,如果mem为NULL,则为NULL。

g_mem_set_vtable ()
void
g_mem_set_vtable (GMemVTable *vtable);
g_mem_set_vtable自版本2.46起已被弃用,不应在新编写的代码中使用。

g_mem_is_system_malloc ()
gboolean
g_mem_is_system_malloc (void);
g_mem_is_system_malloc自版本2.46起已被弃用,不应在新编写的代码中使用。

g_mem_profile ()
void
g_mem_profile (void);
g_mem_profile自版本2.46起已被弃用,不应在新编写的代码中使用。

Types and Values
g_mem_gc_friendly
extern gboolean g_mem_gc_friendly;

如果G_DEBUG环境变量包含密钥gc-friendly,则此变量为TRUE。

struct GMemVTable
struct GMemVTable {
  gpointer (*malloc)      (gsize    n_bytes);
  gpointer (*realloc)     (gpointer mem,
               gsize    n_bytes);
  void     (*free)        (gpointer mem);
  /* optional; set to NULL if not used ! */
  gpointer (*calloc)      (gsize    n_blocks,
               gsize    n_block_bytes);
  gpointer (*try_malloc)  (gsize    n_bytes);
  gpointer (*try_realloc) (gpointer mem,
               gsize    n_bytes);
};
用于执行内存分配的一组函数。 必须在同一程序中对所有分配使用相同的GMemVTable; 对g_mem_set_vtable()的调用(如果存在)应该在使用GLib之前。
与此相关的功能已在2.46中弃用,不再有效。

glib_mem_profiler_table
extern GMemVTable *glib_mem_profiler_table;
glib_mem_profiler_table自版本2.46起已被弃用,不应在新编写的代码中使用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值