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

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

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));

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

感觉有意思?来鼓励一下!
打赏黑光技术

Leave a Reply

Your email address will not be published. Required fields are marked *