我正在调试由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会导致程序在指针实际分配后崩溃?
答案 0 :(得分:3)
在您的代码中
ptr[i] = &i;
创造了三个问题。
malloc()
的实际返回指针丢失(你覆盖它),所以你没有在free()
处拍摄它,导致memory leak。i
是一个本地范围的变量(for
循环体的范围),并且您将存储要在范围外使用的变量的地址(即,终生结束后)。在范围之外尝试访问它的地址将调用undefined behavior。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]
指向某个有效地址的值。您无需再次分配。你不应该。