【发布时间】:2012-07-28 20:18:40
【问题描述】:
typedef struct {
void *elems;//address of the memory block
int elemSize; //
int logicLen;//number of existing elements in vector
int allocLen;//allocated space for the vector
} vector;
static void InsertNumbers(vector *numbers, long n, long d)
{
long k;
long residue;
for (k = 0; k < d; k++) {
residue = (long) (((long long)k * (long long) n) % d);
VectorAppend(numbers, &residue);
}
}
void VectorAppend(vector *v, const void *elemAddr)
{
void *target=(char*)v->elems + (v->logicLen * v->elemSize);
if(v->logicLen==v->allocLen){
v->allocLen*=2;
v->elems=realloc(v->elems,v->allocLen*v->elemSize);
assert(v->elems!=NULL);
}
memcpy(target,elemAddr,v->elemSize);
v->logicLen++;
}
然后,我用下面这句话来调用InsertNumbers()
vector aVector;
VectorNew(&aVector, sizeof(long),4);
long first=139269,second=3021377;
InsertNumbers(&aVector,first , second);
好像 3021377 太大了……
在v->elems=realloc(v->elems,v->allocLen*v->elemSize);我发现当v->allocLen=4096时,程序崩溃并说:这可能是由于堆的损坏
为什么?
【问题讨论】:
-
你能告诉我们更多的周边代码吗?这条线没有错。
-
@Mysticial
ptr=realloc(ptr, N);总是错误的,尽管这不太可能是问题所在。一个显示问题的最小但完整的示例将非常有用。 -
@Flexo:如果后面跟着
if (!ptr) abort();或类似的东西,这并没有错,但是是的,它经常是错误的。 -
@DietrichEpp 它总是错误的,因为当
reallocretval 为NULL时,如果没有其他指针指向ptr指向的内容,它可能会导致内存泄漏 -
@pb2q:在退出的程序中不可能导致内存泄漏,因为退出程序会释放所有内存。不是每个人都想为每个分配编写错误处理代码,当他们打算用
abort()处理它们时。
标签: c memory heap-memory