realloc只是扩展内存还是会导致内存问题?

realloc只是扩展内存还是会导致内存问题?,c,memory-management,realloc,C,Memory Management,Realloc,我有以下代码: #include <stdio.h> #include <stdlib.h> #define OUT void getDataFromServer(OUT int** array, OUT int* size) { static int tmpArr[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0

我有以下代码:

#include <stdio.h>
#include <stdlib.h>
#define OUT

void getDataFromServer(OUT int** array, OUT int* size)
{
    static int tmpArr[] = {0x00, 0x01, 0x02, 0x03,  0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
                        0x10, 0x11, 0x12, 0x13,  0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F};
    *size = sizeof tmpArr / sizeof(int);
    printf("Before realloc: %p\n", *array);
    *array = realloc(*array, sizeof(*array) * *size);
    printf("After realloc : %p\n", *array);
    int i=0;
    for (; i < *size; i++)
    {
        (*array)[i] = tmpArr[i];
    }
}

int main(void)
{
    int size = 0;
    int* dataFromServer = malloc(sizeof *dataFromServer);
    printf("in main: %p\n", dataFromServer);
    getDataFromServer(&dataFromServer, &size);

    int x;
    for (x=0; x < size; x++)
        printf("%d ", dataFromServer[x]);
    printf("\n\n");
    free(dataFromServer);
    return 0;
}
从输出中,
realloc
返回指向新内存地址的指针

所以问题是,除了释放原始
malloc
创建的位置之外,我是否应该明确释放这个位置

或者它正在执行上面的代码所要求的操作,即只需扩展先前保留的内存位置

谢谢


编辑
:实际上,下面的每个答案都为我提供了一条宝贵的信息。因为我只能选择一个答案来接受。我已经选择了一个纠正我的上述代码

这里有两种情况

  • Realloc失败:您只负责释放原始指针
  • Realloc成功:您只负责释放返回的指针
注意:
realloc
功能不能保证扩展内存位置。实际上,它可以通过选择0的大小来缩小内存

除了释放该位置之外,我还应该显式释放该位置吗 由原始malloc创建


不,realloc应该负责。即使内存重新分配到新的地址空间,如果realloc成功,先前分配给malloc的内存也会自动释放。

realloc可以执行以下三项操作之一:

1) 它发现你以前的记忆可以被扩展,而不需要去改变它

2) Is可以满足您的请求,但内存对象必须放在另一个位置

3) 它可能会失败

在你的情况下,似乎发生了。编辑:它确实返回了不同的指针,因此选择了2)


顺便说一句,在案例3)中,它返回NULL。没有发生任何事情,指针仍然指向有效的旧对象。

在调用
realloc
并返回某个指针后,您应该忘记上一个指针,只保留“新”指针

如果
realloc
调整了它的大小,那么
realloc
将返回它,如果它在内存中分配了一个新空间并复制了以前的内容,它将释放旧指针并返回一个新指针

但是,永远不要用调用
realloc
的结果覆盖旧指针(就像您在代码中所做的那样):事实上,当
realloc
失败时,它将返回
NULL
,并且不会释放旧指针,因此,如果您正在覆盖存储它的唯一变量,您正在失去释放该内存的唯一方法,因此出现内存泄漏。因此,调用
realloc
的“规范”方法是:

/* assuming myPtr contains the malloced memory */
void * tempPtr=realloc(myPtr, newSize);
if(tempPtr==NULL)
{
    /* realloc failed, handle the error and, if aborting, free myPtr */
}
else
    myPtr = tempPtr;

/* ... */

/* when you no longer need it free the memory */
free(myPtr);

成功的realloc()@wildplasser:当你不再需要它时,你最好不要释放它;我将澄清那些
/**/。我知道,但这可能会让新手感到困惑。这个线程是关于realloc(),而不是关于使用后释放内存。@wildplasser:他明确地问了如何在调用
realloc
后释放内存。。。无论如何,我说得更清楚了。
/* assuming myPtr contains the malloced memory */
void * tempPtr=realloc(myPtr, newSize);
if(tempPtr==NULL)
{
    /* realloc failed, handle the error and, if aborting, free myPtr */
}
else
    myPtr = tempPtr;

/* ... */

/* when you no longer need it free the memory */
free(myPtr);