c种内存分配错误:malloc.c:3096: sYSMALLOc: Assertion

2012年11月19日 | 由 helight | 500字 | 阅读大约需要1分钟 | 归档于 linux 应用 | 标签 #uwsgi #django

今天在学习一个小程序的时候出现了下面的内存分配错误。

rbtest: malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)’ failed. Aborted

经过baidu查资料之后得知是因为内存的分配使用有问题,在malloc和free还有malloc获得内存的使用上会有这样的问题, 在程序中,如果越界使用了上一次malloc(或new)分配的空间,则会导致本次分配出错(错误提示就是上面的),所以针对这种问题就需要仔细分析代码种malloc后的内存是否正确使用,我的代码中我又仔细看了之后发现了问题: 内存分配的结构体是这样的

typedef struct TNode
{
    int key;
    struct TNode *parent,*left,*right;
}TNode,*Tree; 

内存分配和使用是这样的:

root = (Tree)malloc(sizeof(Tree)); //上面这里明显的错误,这里是申请了一个指针空间,而不是结构体空间,所以下面的结构体赋值就会错误,会出现内存访问越界等问题,或者不出问题,为下次的内存分配造成影响,这里的影响也就是上面所出现的错误。 
root->left=NULL;
root->right=NULL;
root->key=-1; 

这样处理之后,程序可以正常走下去,但是你再次malloc分配内存的时候就会出现malloc.c:3096这个错误了. 我的程序也正是在这样的情况下出的问题:

Tree x = (TNode *)malloc(sizeof(TNode)); 

这里是第二次申请内存的地方,这里便出了问题了。