我爱编程

linux系统编程-内存管理day03

2018-05-27  本文已影响0人  桔子满地

调试内存分配

程序可以设置MALLOC_CHECK_环境变量来开启存储系统额外的调试功能。

$ MALLOC_CHECK_=1 ./rudder

MALLOC_CHECK_有三种设定:
MALLOC_CHECK_=0, 存储系统会忽略所有错误
MALLOC_CHECH_=1, 信息会被输出到标准错误输出stderr.
MALLOC_CHECK_=2, 进程会立即通过abort( )终止。

获得统计数据

  1. mallinfo( )函数用来获得关于动态存储分配系统的统计数据:
#include <malloc.h>
struct mallinfo mallinfo(void);
struct mallinfo m;
m = mallinfo( );
printf("free chunks: %d \n", m.ordblks);
  1. stats( )函数,将跟内存相关的统计数据打印到标准错误输出(stderr):
#include <malloc.h>
void malloc_stats(void);

基于的分配

之前的几节关于动态内存分配机制都是使用存储器映射来实现的(因为堆和匿名映射本来就是动态的,所以很自然地想到用它们来分配动态内存).
另一个在程序地址空间中常用的结构,,是用来存放程序的自动变量的。

  1. alloca( )函数:
#include <alloca.h>
void *alloca(size_t size);

调用alloca( )时,成功时会返回一个指向size字节大小的内存指针。

注意不能使用由alloca( )得到的内存来作为一个函数调用的参数,因为分配到的内存块会被当做参数保存在函数的栈中。例如:以下就是错误的

/* Do not do this! */
ret = foo (x, alloca(100));
  1. strdupa( ) 和 strndupa( )
    alloca( )常见的一个用法是来临时复制一个字符串。例如:
char *dup;
dup = alloca(strlen(song) + 1);
strcpy(dup, song);
/* 使用dup */
return; /* dup is automatically freed */

linux专门提供了strdupa( )来将一个给定的字符串复制到栈中:

#define _GNU_SOURCE
#include <string.h>
char *strdupa (const char *s);
char *strndupa (const char *s, size_t n);
  1. 变长数组VLAs
    VLAs用与alloca( )相似的方法避免了动态存储分配所产生的负载。例如:
for (i  = 0; i < n; ++i) {
    char foo[i+1];
    /* use 'foo' ... */
}

在上面的例子中,在每次循环中,foo都被动态的创建,并在这轮循环结束时自动释放

上一篇 下一篇

猜你喜欢

热点阅读