为什么realloc()不';当大小大于8192字节时无法工作?
看起来3021377太大了。。。 在为什么realloc()不';当大小大于8192字节时无法工作?,c,memory,heap,C,Memory,Heap,看起来3021377太大了。。。 在v->elems=realloc中(v->elems,v->allocLen*v->elemSize)我发现当v->allocLen=4096时,程序崩溃并说:这可能是由于堆的损坏 为什么?这不是您发布的代码的问题,这是其他地方的问题 发生的情况是您的程序损坏了堆,然后realloc检测到堆已损坏 您需要按如下方式检测损坏: 确保启用调试符号 通过Valgrind运行您的程序 编辑:您添加的代码中存在严重错误 vector aVector; VectorNew
v->elems=realloc中(v->elems,v->allocLen*v->elemSize)代码>我发现当v->allocLen=4096时,程序崩溃并说:这可能是由于堆的损坏
为什么?这不是您发布的代码的问题,这是其他地方的问题
发生的情况是您的程序损坏了堆,然后realloc
检测到堆已损坏
您需要按如下方式检测损坏:
确保启用调试符号
通过Valgrind运行您的程序
编辑:您添加的代码中存在严重错误
vector aVector;
VectorNew(&aVector, sizeof(long),4);
long first=139269,second=3021377;
InsertNumbers(&aVector,first , second);
要解决此问题,请将目标的计算移动到重新分配下:
void VectorAppend(vector *v, const void *elemAddr)
{
void *target = (char *) v->elems + v->logicLen * v->elemSize;
if (v->logicLen == v->allocLen) {
v->allocLen *= 2;
// Once you call 'realloc', the value of 'elems' might change
// This means that 'target' is now INVALID
// 'target' is based on the old value of 'elems'
v->elems = realloc(v->elems,v->allocLen*v->elemSize);
assert(v->elems != NULL);
}
memcpy(target, elemAddr, v->elemSize);
v->logicLen++;
}
另一个错误:您的评论中有一个错误,这是代码的一部分,我建议您认真对待评论
void VectorAppend(vector *v, const void *elemAddr)
{
if (v->logicLen == v->allocLen) {
v->allocLen *= 2;
v->elems = realloc(v->elems,v->allocLen*v->elemSize);
assert(v->elems != NULL);
}
void *target = (char *) v->elems + v->logicLen * v->elemSize;
memcpy(target, elemAddr, v->elemSize);
v->logicLen++;
}
注释中不应说“分配4*4”字节,因为这会产生误导:有一天,您将在非Windows的64位系统上编译程序,它将是8x4字节。您最好删除注释并阅读代码。您能向我们展示更多相关代码吗?这句话没有错。@Mysticialptr=realloc(ptr,N)代码>总是错误的,尽管这里不太可能出现问题。不过,一个简单但完整的例子可以说明这个问题。@flex:if(!ptr)abort()后面跟if,这并没有错
或类似的东西,但是是的,它经常是错误的。@DietrichEpp它总是错误的,因为当realloc
retval为NULL
时,如果没有指向ptr
点的其他指针,它会导致内存泄漏to@pb2q:不可能在正在退出的程序中导致内存泄漏,因为退出程序会释放所有内存。不是每个人都想为每个分配编写错误处理代码,而他们打算使用abort()
来处理所有分配。
void VectorAppend(vector *v, const void *elemAddr)
{
if (v->logicLen == v->allocLen) {
v->allocLen *= 2;
v->elems = realloc(v->elems,v->allocLen*v->elemSize);
assert(v->elems != NULL);
}
void *target = (char *) v->elems + v->logicLen * v->elemSize;
memcpy(target, elemAddr, v->elemSize);
v->logicLen++;
}
VectorNew(&aVector, sizeof(long), 4); // allocate 4*4 bytes