编辑:我改变了示例并尝试澄清我在做什么。
我有一个递归函数,它将一个指向数组的指针作为参数,创建一个指向较小数组的指针,并调用自身,将较小的数组作为参数传递
int ListOfNumbers::recursiveQuickselect(int *array, int arrayLen){
if(arrayLen > 10){
int *tempArray;
tempArray = new int[some value];
...edit tempArray....
return recursiveQuickselect(tempArray, tempArrayLen);
}
else{
//base case:
sort this small array and return an element from it
}
当我运行valgrind时,我被告知在recursiveQuickselect函数中丢失了1个块。
我在哪里删除此代码中的tempArray?
如果我在通话之前将其删除,那么我什么也没有通过该功能
我显然无法在return语句后删除它。
注意:我不能使用向量,这是一个不允许它们的学校作业。
答案 0 :(得分:1)
您希望将动态大小的数组的地址传递给函数,但是
想要自动清理动态内存,因为你无法删除
记忆。像许多评论一样,这正是std::vector
所做的,例如
在你的例子中
ListOfNumbers::medianOfFivePivot(int *array, int arrayLen){
std::vector<int> tempArray(tempArrayLen);
// ...edit tempArray....
return getMedian(&tempArray[0], tempArrayLen);
答案 1 :(得分:0)
你delete
的记忆getMedian
怎么样?如果getMedian
是递归的,只需在基本情况下删除。
或者(@Havenard),你可以存储getMedian()
的值删除内存然后返回值。
C ++提供std::vector
,因此您不必处理内存管理,为什么不使用它们呢?
答案 2 :(得分:-1)
你应该能够
delete[] tempArray;
如果这不起作用,那么我真的不明白这个问题。
编辑:在返回
之前放置删除[]行