- 常见动态内存错误:
- 未检查返回值:
malloc
可能分配内存失败并返回NULL
,若不检查直接使用返回指针会导致未定义行为。例如:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = (int *)malloc(10 * sizeof(int));
// 未检查ptr是否为NULL
*ptr = 10;
free(ptr);
return 0;
}
- **内存泄漏**:分配的内存使用完后未释放,导致内存浪费。比如:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = (int *)malloc(10 * sizeof(int));
// 程序结束时未释放ptr指向的内存
return 0;
}
- **释放已释放的内存**:重复释放同一块内存会导致程序崩溃。示例:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = (int *)malloc(10 * sizeof(int));
free(ptr);
// 再次释放ptr
free(ptr);
return 0;
}
- **内存越界访问**:访问已分配内存块之外的区域,破坏其他数据或程序状态。如下:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = (int *)malloc(5 * sizeof(int));
// 访问超出分配范围的内存
for(int i = 0; i < 10; i++) {
ptr[i] = i;
}
free(ptr);
return 0;
}
- 避免错误的方法:
- 检查返回值:在使用
malloc
返回的指针前,检查是否为NULL
。
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = (int *)malloc(10 * sizeof(int));
if(ptr == NULL) {
fprintf(stderr, "内存分配失败\n");
return 1;
}
*ptr = 10;
free(ptr);
return 0;
}
- **及时释放内存**:在内存使用完毕后,调用`free`函数释放。
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = (int *)malloc(10 * sizeof(int));
if(ptr == NULL) {
fprintf(stderr, "内存分配失败\n");
return 1;
}
// 使用ptr
free(ptr);
return 0;
}
- **避免重复释放**:释放内存后将指针置为`NULL`,这样再次释放`NULL`指针是安全的。
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = (int *)malloc(10 * sizeof(int));
if(ptr == NULL) {
fprintf(stderr, "内存分配失败\n");
return 1;
}
free(ptr);
ptr = NULL;
// 再次free(ptr) 是安全的
free(ptr);
return 0;
}
- **防止内存越界**:确保对内存的访问在已分配的范围内。
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = (int *)malloc(5 * sizeof(int));
if(ptr == NULL) {
fprintf(stderr, "内存分配失败\n");
return 1;
}
for(int i = 0; i < 5; i++) {
ptr[i] = i;
}
free(ptr);
return 0;
}