内存泄漏
当动态内存被分配但从未释放时,就会发生内存泄漏。
如果内存泄漏发生在循环中或频繁调用的函数中,它可能会占用过多内存,导致计算机变慢。
如果指向动态内存的指针在内存可以被释放之前丢失,就存在内存泄漏的风险。这可能会意外发生,因此重要的是要小心并跟踪指向动态内存的指针。
以下是一些指向动态内存的指针可能丢失的例子。
例子 1
指针被覆盖:
int x = 5;
int ptr;
ptr = calloc(2, sizeof(ptr));
ptr = &x;
在这个例子中,当指针被更改为指向 x 时,由 calloc() 分配的内存将无法再访问。
例子 2
指针仅存在于函数内部:
void myFunction() {
int ptr;
ptr = malloc(sizeof(ptr));
}
int main() {
myFunction();
printf("The function has ended");
return 0;
}
在这个例子中,函数内部分配的内存在函数结束后仍然保留,但无法再访问。防止这个问题的一种方法是在函数结束前释放内存。
例子 3
重新分配失败时指针丢失:
int* ptr;
ptr = malloc(sizeof(ptr));
ptr = realloc(ptr, 2sizeof(*ptr));
如果 realloc() 无法重新分配内存,它将返回一个指向 NULL 的指针,并且原始内存将保持保留。
在这个例子中,如果 realloc() 失败,则 NULL 指针将被分配给 ptr 变量,覆盖原始内存地址,使其无法再访问。