2013-02-19 69 views
0

我正在嘗試讀取包含隨機數列表的文本文件,並使用mergesort對其進行排序以顯示。數字被讀入到一個動態數組中。不幸的是,每當我嘗試刪除未使用的數組時,都會檢測到堆損壞錯誤。刪除數組時發生堆損壞錯誤

歸併功能:在發生合併功能

void mergesort(int *arr, int first, int last) 
{ 
if(first < last) 
    { 
    int middle = ((first + last)/2); 
    mergesort(arr, first, middle); 
    mergesort(arr, middle+1, last); 
    merge(arr, first, last); 
    } 
} 

錯誤,當我刪除tempArr:

void merge(int *arr, int first, int last) 
{ 
int *tempArr = new int[last]; 

int mid = (first+last)/2; 
int first1 = first; 
int last1 = mid; 
int first2 = mid + 1; 
int last2 = last; 

int index = first1; 

for(; (first1 <= last1) && (first2 <= last2); ++index) 
{ 
    if (arr[first1] < arr[first2]) 
    { 
     tempArr[index] = arr[first1]; 
     ++first1; 
    } 
    else 
    { 
     tempArr[index] = arr[first2]; 
     ++first2; 
    } 
} 

for(; first1 <= last1; ++first1, ++index) 
    tempArr[index] = arr[first1]; 

for(; first2 <= last2; ++first2, ++index) 
    tempArr[index] = arr[first2]; 

for(index=first;index<=last;++index) 
    arr[index] = tempArr[index]; 

delete [] tempArr; 
} 
+1

除了使用'new','delete'和流,我不會稱之爲C++。使用引用而不是指針來傳遞參數「引用」,並使用['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)而不是原始數組。 – 2013-02-19 10:23:46

+3

至於你的問題,在調試器中運行它,然後逐行執行代碼,同時確保不覆蓋數組的末尾。 – 2013-02-19 10:24:30

+1

注意'(first + last)/ 2'可以溢出 - 'first +(last - first)/ 2'比較安全。 – molbdnilo 2013-02-19 10:30:16

回答

6

這個問題似乎是,你分配你的數組作爲int *tempArr = new int[last]。其元素的數量是last,它們的指數是0,1,... last - 1

接近函數結束時,你有這樣的:

for(; first2 <= last2; ++first2, ++index) 
    tempArr[index] = arr[first2]; 

last2被初始化到last值。這意味着循環中的最終分配將在index == last時發生,因此您正在訪問tempArr[last]。這超出了數組範圍。