C++ 如何删除在函数调用C++;
编辑:我改变了这个例子,试图澄清我在做什么 我有一个递归函数,它将指向数组的指针作为参数,创建指向较小数组的指针,然后调用自身,将较小数组作为参数传递C++ 如何删除在函数调用C++;,c++,pointers,C++,Pointers,编辑:我改变了这个例子,试图澄清我在做什么 我有一个递归函数,它将指向数组的指针作为参数,创建指向较小数组的指针,然后调用自身,将较小数组作为参数传递 int ListOfNumbers::recursiveQuickselect(int *array, int arrayLen){ if(arrayLen > 10){ int *tempArray; tempArray = new int[some value]; ...edit tempArray
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时,我被告知递归QuickSelect函数中丢失了1个块
在这段代码中,我应该在哪里删除tempArray
如果我在调用之前删除它,那么我不会向函数传递任何内容
我显然不能在return语句之后删除它
注意:我不能使用向量,这是一项学校作业,不允许使用向量。您应该能够
delete[] tempArray;
如果这不起作用,那么我真的不明白这个问题
编辑:将delete[]行放在return之前您如何
删除中的内存?如果getMedian
是递归的,只需在基本情况下删除即可
或者(@Havenard),您可以存储getmedia()
删除内存的值,然后返回该值
C++提供了std::vector
,因此您不必处理内存管理,为什么不使用它们呢?您希望将动态大小数组的地址传递给函数,但是
想要自动清理动态内存,因为您无法删除
记忆。像许多评论一样,这正是std::vector
所做的。
在你的例子中
ListOfNumbers::medianOfFivePivot(int *array, int arrayLen){
std::vector<int> tempArray(tempArrayLen);
// ...edit tempArray....
return getMedian(&tempArray[0], tempArrayLen);
listofNumber::medianOfFivePivot(int*数组,int数组){
std::向量tempArray(tempArrayLen);
//…编辑临时数组。。。。
返回getMiddian(&tempArray[0],tempArrayLen);
我知道如何删除它,我想知道什么时候可以这样做,如果我在return语句之后删除它,那么它就永远不会被删除。正确,因为return会停止函数并将控制权转移回调用方。请在返回的正上方执行。更新answerreturn
会停止函数,并且在它之后,您不能删除在返回之前必须删除
。或者使用std::vector
而不是数组,这样编译器会自动处理它。@a我只需保存getmedia()的结果
在某个地方,删除tempArray,然后返回您刚刚保存的值…在这方面不需要使用向量。使用额外的中值
变量实际上是正确的方法…如果您绝对必须使用new[]
和delete[]
,从而为您自己制造了这些问题。对于您描述的用例,tempArray根本不需要是指针。只需通过GetMiddian将引用传递给它。这将被计算,收集结果,原始变量将超出范围。不需要堆分配。@dwerner您介意详细说明传递引用吗?我不知道理解你的意思。我还更改了示例以更好地说明我的问题。这里的重要问题是tempArray
的大小是否事先知道。在第一种情况下,你不需要动态分配数组。这是针对类的,所以我必须使用数组。但事实上,我真正的问题是将指针传递到递归functions!但是在函数内部,因为指针是由标头定义的,所以我从不调用new。我是否对方法标头中定义的指针调用delete[]呢?@user3304376 Correct,calldelete[]函数的指针是非常不规则的。分配内存的函数应该负责处理。我不能使用向量,我编辑了这个问题。我希望现在更清楚。学校真的落后于时代;向量已经在每一个C++标准中,包括上个世纪的第一个C++。尽管如此,最好的解决办法通常是编写一个简单的向量类来包装new[]/delete[]