我在循环中运行以下函数:
int* rpermute(int n)
{
int* a = malloc(n * sizeof(int));
int k;
for (k = 0; k < n; k++)
{
a[k] = k;
}
for (k = n - 1; k > 0; k--)
{
int j = rand() % (k + 1);
int temp = a[j];
a[j] = a[k];
a[k] = temp;
}
return a;
}
如果我在我的代码中设置一个新的 int 变量,每个变量都在变化,我认为这是一个缓冲区溢出问题。
运行瓦尔格林德,我得到以下内容:
==4459== 73,036 bytes in 19 blocks are definitely lost in loss record 1 of 1
==4459== at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4459== by 0x402CFB: rpermute (in /home/giwrgos/Desktop/crowdv22/crowd_evacuation)
==4459== by 0x403378: main (in /home/giwrgos/Desktop/crowdv22/crowd_evacuation)
我通过虚拟盒子使用 linux,但我设置了足够的存储空间和内存,我该怎么办?
编辑:请参阅下面的海报评论,问题毕竟不在此代码中。
您应该简单地free()
中分配并由 rpermute()
返回的内存。 这必须在您调用 rpermute()
的代码中完成,一旦您完成了这个数组。
我知道您为不同的int
值(rpermute()
的 n
参数)重新生成此数组。 也许你只是为你保留的数组分配一个新的输出:
int* array;
...
array = rpermute(100);
// Some time later.
array = rpermute(200); // Previous array memory is leaking.
您应该改为:
free(array);
array = rpermute(200);
请注意,这不是"缓冲区溢出流",而是内存泄漏。 我检查了缓冲区溢出的代码:它外面的 a
个点的索引,但这在两个循环中似乎都可以。