这个函数在什么情况下可能会导致内存泄漏?
Under what conditions may this function cause memory leakage?
char *expandspace (char* test) {
static int i = 0;
test = realloc (test, ++i * 100);
if(test == NULL) {
printf("realloc fail");
}
return test;
}
这个函数在什么情况下会导致内存泄漏?有没有办法修复它以便它工作
每次?谢谢
如果realloc
失败,则不释放原来的内存块(参见,例如realloc at cppreference.com):
If there is not enough memory, the old memory block is not freed and
null pointer is returned.
因此在这种情况下,您的函数将 return NULL
。根据您是否将函数结果直接分配给传递给 expandspace
的变量,在这种情况下您可能会出现泄漏:
有问题:
int main() {
char* test = expandspace(NULL); // let's assume this is OK...
// possible leak: if realloc fails, test becomes NULL but the memory it pointed to did not get freed
// and you lost the pointer, so you cannot free it any more:
test = expandspace(test);
}
更好:
int main() {
char* test = expandspace(NULL); // let's assume this is OK...
char *newTest = expandspace(test);
if (!newTest) {
free(test);
test=NULL;
}
...
}
有一个很常见但 pedantic/artificial 很多人喜欢做的评论 - 它是这样的:不要使用与 realloc
参数相同的指针和结果。因为万一 realloc 失败,你就丢失了指向原始内存的指针。
但是你要问的问题是:是什么原因导致realloc无法开始?万一 realloc 失败,这意味着堆已满,您的程序无论如何都无法继续做任何有意义的事情——您将需要退出。所以这句话在实践中是荒谬的——将你的编程运行留在一个不存在可靠堆的未定义世界中是明显危险的做法。
char *expandspace (char* test) {
static int i = 0;
test = realloc (test, ++i * 100);
if(test == NULL) {
printf("realloc fail");
}
return test;
}
这个函数在什么情况下会导致内存泄漏?有没有办法修复它以便它工作 每次?谢谢
如果realloc
失败,则不释放原来的内存块(参见,例如realloc at cppreference.com):
If there is not enough memory, the old memory block is not freed and null pointer is returned.
因此在这种情况下,您的函数将 return NULL
。根据您是否将函数结果直接分配给传递给 expandspace
的变量,在这种情况下您可能会出现泄漏:
有问题:
int main() {
char* test = expandspace(NULL); // let's assume this is OK...
// possible leak: if realloc fails, test becomes NULL but the memory it pointed to did not get freed
// and you lost the pointer, so you cannot free it any more:
test = expandspace(test);
}
更好:
int main() {
char* test = expandspace(NULL); // let's assume this is OK...
char *newTest = expandspace(test);
if (!newTest) {
free(test);
test=NULL;
}
...
}
有一个很常见但 pedantic/artificial 很多人喜欢做的评论 - 它是这样的:不要使用与 realloc
参数相同的指针和结果。因为万一 realloc 失败,你就丢失了指向原始内存的指针。
但是你要问的问题是:是什么原因导致realloc无法开始?万一 realloc 失败,这意味着堆已满,您的程序无论如何都无法继续做任何有意义的事情——您将需要退出。所以这句话在实践中是荒谬的——将你的编程运行留在一个不存在可靠堆的未定义世界中是明显危险的做法。