【问题标题】:Is this memory leak from my program or the computer? How can I fix it?这是我的程序或计算机的内存泄漏吗?我该如何解决?
【发布时间】:2020-08-26 07:40:00
【问题描述】:

我正在练习我的编程和内存分配。当我在没有 valgrind 的情况下执行时,程序可以正常工作,它会做它需要做的事情。然后我用 valgrind 执行,看看我是否有任何内存泄漏。这是我用 valgrind 执行时得到的。我有点新,我找不到为什么我有这么多内存泄漏或错误。代码如下。谢谢!!

 1 #include <stdio.h>
  2 #include <stdlib.h>
  3 int* fun(int *l){
  4          int *k;
  5          k = (int *)malloc (4*sizeof(int));
  6          for(int i = 0; i<4; i++){
  7              k[i] = 2*l[i];
  8              l[i] += 1;
  9          }
 10          return k;
 11          free(k);
 11 }
 12 int main(){
 13          int *s;
 14          int *t;
 15          s = (int *)malloc (4*sizeof(int));
 16          s[0] = 2; s[1] = -3; s[2] = 5; s[3] = 0;
 17          t = fun(s);
 18          for(int i = 0; i<4; i++){
 19              printf(" %d   %d\n", s[i], t[i]);
 20          }
 21          free(s);
 22          free(t);
 23          return 0;
 24 }

【问题讨论】:

  • 语句free(k)由于前面的return语句而无法访问。
  • 如果我把 free(k) 放在返回 if 我删除 free(k) 之前,我也会得到内存泄漏
  • 请不要发布图片:而是将数据作为文本复制/粘贴到问题中。请不要张贴行号。为了重现问题,我们必须编辑每一行以删除行号
  • OT: about: k = (int *)malloc (4*sizeof(int)); 1) 返回的类型是void*,可以分配给任何指针。强制转换只会使代码混乱并且容易出错。 2) 始终检查 (!=NULL) 返回值以确保操作成功。如果不成功,请调用perror( "your error message"); 将您的错误消息和系统认为错误发生的文本原因正确输出到stderr
  • 我投票结束这个问题,因为发布的代码不会导致生成 valgrind 错误消息

标签: c memory memory-management memory-leaks valgrind


【解决方案1】:

函数fun 中的free 语句永远不会执行,因为它之前有return 语句。

另外,您可以考虑使用vector&lt;int&gt; 代替*k*l*s*t

例子:

#include <vector>
using namespace std;

vector<int> s;      
s[0]=1; 

【讨论】:

  • 如果我把它放在退货之前,我仍然会泄漏
  • 用新例子查看我的答案
  • 我认为它的 valgrind 编译器以某种方式损坏或它的计算机,因为我得到完全相同的泄漏与只执行 printf("hello\n"); 的程序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 2020-01-01
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多