为什么realloc()不';当大小大于8192字节时无法工作?

为什么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

看起来3021377太大了。。。 在
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字节。您最好删除注释并阅读代码。

    您能向我们展示更多相关代码吗?这句话没有错。@Mysticial
    ptr=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