2014-04-27 26 views
0

編輯:我改變了這個例子,試圖澄清我在做什麼。如何刪除作爲函數調用參數傳遞的指針C++

我有一個遞歸函數,它的指針數組作爲參數,創建一個指針到一個較小的陣列,並調用自身,傳遞較小數組作爲參數

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

使用'std :: vector'。 – milleniumbug

+0

這個帶有額外'median'變量的想法實際上是正確的做法......如果你絕對必須使用'new []'和'delete []',那麼就會爲你自己創造這些問題。 – aschepler

+0

對於你描述的用例,tempArray不一定是一個指針。只需通過getMedian將ref傳遞給它即可。這將被評估,結果收集,原始變量將超出範圍。不需要堆分配。 – dwerner

回答

-1

你應該能夠

delete[] tempArray; 

如果不工作,那麼我真的不明白的問題。

編輯:將返回前右刪除[]行

+0

我知道如何刪除它,我想知道什麼時候這樣做,如果我在返回語句後刪除它,那麼它永遠不會被刪除。 – user3304376

+0

正確,因爲返回停止功能並將控制權交還給調用者。在回報之上做正確的事。更新回答 – phyrrus9

+0

@ phyrrus9但是然後沒有任何東西傳遞給函數... – yizzlez

0

你怎麼樣deletegetMedian內存?如果getMedian是遞歸的,只需在基本情況下刪除。

或者(@Havenard),可以存儲getMedian()的值,然後刪除內存並返回該值。

C++耗材std::vector所以你不必處理內存管理,爲什麼不使用它們呢?

+0

這是一個類,所以我必須使用數組。但是,我真正的問題實際上是將指針傳遞給遞歸函數!然而在函數內部,因爲指針是由頭部定義的,所以我從來不會調用new。我是否在方法頭中定義的指針上調用delete []? – user3304376

+0

@ user3304376正確,在函數內的指針上調用'delete []' – yizzlez

+0

這非常不規則。分配內存的功能應該負責配置它。 – Havenard

1

您希望將動態大小的陣列的地址傳遞給函數,但 想要自動清除動態內存,因爲您無法刪除內存的 。像許多人所評論的那樣,這正是std::vector所做的,例如 在你的例子中

ListOfNumbers::medianOfFivePivot(int *array, int arrayLen){ 
    std::vector<int> tempArray(tempArrayLen); 

    // ...edit tempArray.... 

    return getMedian(&tempArray[0], tempArrayLen); 
+0

我不能使用矢量,我編輯了這個問題。我希望現在更清楚。 – user3304376

+0

這所學校*非常*落後於時代; vector已經在每一個C++標準中都包括在前一個世紀中的第一個。不要再接受那位教授的壞習慣。話雖如此,最好的解決方案通常是編寫一個簡單的類向量類來包裝'new []/delete []' – MSalters

相關問題