我一直在研究这个程序。这只是提取的两个导致内存泄漏的函数,我似乎无法调试。任何帮助都会很棒!
vector<int**> garbage;
用于删除已用内存的代码
void clearMemory()
{
for(int i = 0; i < garbage.size(); i++)
{
int ** dynamicArray = garbage[i];
for( int j = 0 ; j < 100 ; j++ )
{
delete [] dynamicArray[j];
}
delete [] dynamicArray;
}
garbage.clear();
}
用于声明动态数组的代码
void main()
{
int ** dynamicArray1 = 0;
int ** dynamicArray2 = 0;
dynamicArray1 = new int *[100] ;
dynamicArray2 = new int *[100] ;
for( int i = 0 ; i < 100 ; i++ )
{
dynamicArray1[i] = new int[100];
dynamicArray2[i] = new int[100];
}
for( int i = 0; i < 100; i++)
{
for(int j = 0; j < 100; j++)
{
dynamicArray1[i][j] = random();
}
}
//BEGIN MULTIPLICATION WITH SELF AND ASSIGN TO SECOND ARRAY
dynamicArray2 = multi(dynamicArray1); //matrix multiplication
//END MULTIPLICATION AND ASSIGNMENT
garbage.push_back(dynamicArray1);
garbage.push_back(dynamicArray2);
clearMemory();
}
答案 0 :(得分:1)
我盯着代码看了一段时间,我似乎无法找到任何泄漏。在我看来,每个delete
只有一个new
,应该是这样。
尽管如此,我真的想说声明std::vector<int**>
几乎无视使用std::vector
本身。
在C ++中,当你必须使用指针时,很少有这种情况,而这不是其中之一。
我承认声明并使用std::vector<std::vector<std::vector<int>>>
会很痛苦,但这会确保您的代码中没有泄漏。
因此,我建议您根据自动管理内存分配的对象重新考虑您的实现。
答案 1 :(得分:0)
第1点:如果您有内存泄漏,请使用valgrind
找到它。就像蓝色一样,我似乎无法在您的代码中发现内存泄漏,但valgrind
会告诉您确定您的内存是什么。
第2点:您正在有效地创建一个2x100x100 3D阵列。 C ++不是这种东西的正确语言。当然,您可以使用具有明显缺点的std::vector<std::vector<std::vector<int>>>
。或者你可以回到C:
int depth = 2, width = 100, height = 100;
//Allocation:
int (*threeDArray)[height][width] = malloc(depth*sizeof(*threeDArray));
//Use of the last element in the 3D array:
threeDArray[depth-1][height-1][width-1] = 42;
//Deallocation:
free(threeDArray);
请注意,这是有效的C,但不是有效的C ++:后一种语言不允许运行时大小为数组类型,而前者支持自C99以来。在这方面,C比C ++更强大。