c - 我该如何纠正这种内存泄漏?
问题描述
这是我使用 malloc 为 C 中的二维数组分配内存并释放它的代码。N 是用户给定的数字
R = malloc(N * sizeof(int *)); // start of memory allocating for **R
if (R == NULL) {
return -1;
}
for (i = 0; i <= N; i++) {
*(R+i) = malloc(N * sizeof(int));
if (*(R + i) == NULL) {
return -1;
}
} // end of memory allocating for **R
for (i = 0 ; i < N; i++){
free(R[i]);
free(R);
}
程序完成后,我收到此错误:double free or corruption (out) Aborted (core dumped)
通过使用 valgrind 进行调试,我收到以下消息:12 bytes in 1 blocks are definitely lost in loss record 1 of 1
在这行代码中检测到此泄漏(根据 valgrind):*(C+i) = malloc(N * sizeof(int));
有关如何修复它的任何帮助?
解决方案
我收到此错误:双重释放或损坏(出)中止(核心转储)
首先注意错误不是内存泄漏,双重释放来自该代码
for (i=0 ; i <N ; i++){
free(R[i]);
free(R);
}
必须是
for (i=0 ; i <=N ; i++){
free(R[i]);
}
free(R);
否则你在第一个循环而不是循环之后释放R
因为从第二个循环开始,R[i]
if undefined 的值和free的行为也未定义,并且您在R上再次调用free ,这两个原因都与valgrind产生的消息兼容。
请注意,我还将测试更改为i<=N
与用于进行分配的测试相同,但两者都假设您的数组已调整大小N+1
(至少),否则您会错过产生内存泄漏的空闲。
如果代码中的分配步骤和空闲步骤不是连续的,并且即使您无法在给定时间分配内存,也完成了空闲步骤,则必须将代码修改为:
if (R != NULL)
{
for (i=0 ; i <=N ; i++){
if (R[i] == NULL) /* allocation failed */
break;
free(R[i]);
}
free(R);
}
如果R为 NULL,则不取消对它的引用,并且不尝试释放未在分配循环中设置的数组的条目,因为(*(R + i) == NULL)
它确实打破了循环
推荐阅读
- apache - 如何阻止来自我以外的域的请求?
- python - 将纪元时间(以毫秒为单位)转换为时间戳到 UTC 错误
- python - Numpy:将数组数据存储到文件
- python - psycopg2 查询可变长度值
- c# - c# - 如何使用 Linq 或其他方式从列表中删除匹配项
- python - 使用随机最大值/最小值替换空值
- python - Python scikit-learn 稀疏矩阵聚类
- python - 我正在尝试生成一行代码来返回单词的分数,但目前我遇到了错误
- javascript - 如何将具有一个元素的数组作为 GET 请求的参数传递
- apache-spark - DELTA 表回滚到以前的版本