Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何删除在函数调用C++;_C++_Pointers - Fatal编程技术网

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会停止函数并将控制权转移回调用方。请在返回的正上方执行。更新answer
return
会停止函数,并且在它之后,您不能
删除
返回
之前必须
删除
。或者使用
std::vector
而不是数组,这样编译器会自动处理它。@a我只需保存
getmedia()的结果
在某个地方,删除tempArray,然后返回您刚刚保存的值…在这方面不需要使用向量。使用额外的
中值
变量实际上是正确的方法…如果您绝对必须使用
new[]
delete[]
,从而为您自己制造了这些问题。对于您描述的用例,tempArray根本不需要是指针。只需通过GetMiddian将引用传递给它。这将被计算,收集结果,原始变量将超出范围。不需要堆分配。@dwerner您介意详细说明传递引用吗?我不知道理解你的意思。我还更改了示例以更好地说明我的问题。这里的重要问题是
tempArray
的大小是否事先知道。在第一种情况下,你不需要动态分配数组。这是针对类的,所以我必须使用数组。但事实上,我真正的问题是将指针传递到递归functions!但是在函数内部,因为指针是由标头定义的,所以我从不调用new。我是否对方法标头中定义的指针调用delete[]呢?@user3304376 Correct,call
delete[]函数的指针是非常不规则的。分配内存的函数应该负责处理。我不能使用向量,我编辑了这个问题。我希望现在更清楚。学校真的落后于时代;向量已经在每一个C++标准中,包括上个世纪的第一个C++。尽管如此,最好的解决办法通常是编写一个简单的向量类来包装
new[]/delete[]