释放void指针数组的元素

时间:2017-04-10 09:26:47

标签: c malloc free dynamic-memory-allocation void-pointers

我正在调试由Valgrind检测到的有几个内存泄漏的其他人编写的代码。我认为导致问题的部分代码涉及def sumPowerN(k,n): result = 0 for n in range(1, n+1, n): result = result + (1 ** k) + (2 ** k) + (n ** k) return result def main(): print("Program to calculate sum of k-th powers of numbers from 1 to n") kVal, nVal = input("Please enter the k-th value and the n-th value (k,n): ") answer = sumPowerN(kVal, nVal) print("The value of the sum is:", answer ,".") main() 指针:

void

我创建了一个小测试程序来检查错误是我认为的错误(在调用int noElements = 100; void** ptr = malloc( noElements * sizeof(void*)); for(int i = 0; i < noElements; i++) { ptr[i] = malloc(sizeof(void*)); } //Operation filling the array and doing calculation free(ptr); //This will not clear the underlying array causing the memory leak? 之前没有释放每个ptr[i]),但是在尝试释放元素时遇到错误。我的测试程序如下所示:

free(ptr);

为什么在每个数组元素上调用free会导致程序在指针实际分配后崩溃?

2 个答案:

答案 0 :(得分:3)

在您的代码中

  ptr[i] = &i;

创造了三个问题。

  1. 它会使malloc()的实际返回指针丢失(你覆盖它),所以你没有在free()处拍摄它,导致memory leak
  2. i是一个本地范围的变量(for循环体的范围),并且您将存储要在范围外使用的变量的地址(即,终生结束后)。在范围之外尝试访问它的地址将调用undefined behavior
  3. 忽略第2点)尝试free() ptr[i]将再次导致undefined behavior,因为内存分配器功能未返回指针。

答案 1 :(得分:1)

您的指针已分配了一个不是您想要的值。

for (int i = 0; i < num; i++)
{
    ptr[i] = malloc(sizeof(void*));
    ptr[i] = &i;    //If I never point elements at anything, this code works
}

首先分配malloc()返回的有效内存地址。 可以使用free()免费使用此地址。 但是你分配另一个地址。您的本地变量i的地址。此内存位置未使用malloc()分配,因此无法免费。通过分配此地址,您丢失了动态分配的地址,从而导致内存泄漏。

你的评论错了。您已经指定了ptr[i]指向某个有效地址的值。您无需再次分配。你不应该。