#include <iostream>
using namespace std;
void MergeSort(int a[], int n) ;
void MergePass(int x[], int y[], int s, int n);
void Merge(int c[], int d[], int l, int m, int r) ;
int main(int *arg[])
{
int a[]={54,6,64,84,98,498,446,49,98,981};
MergeSort(a, 10);
for(int m = 0;m < 10;m++)
cout<<a[m]<<endl;
return 0;
}
void MergeSort(int a[], int n)
{// 使用歸並排序算法對a[0:n-1] 進行排序
int *b = new int [n]; //?????有沒有內存洩露
int s = 1; // 段的大小
while (s < n) {
MergePass(a, b, s, n); // 從a歸並到b
s += s;
MergePass(b, a, s, n); // 從b 歸並到a
s += s;
}
}
void MergePass(int x[], int y[], int s, int n)
{// 歸並大小為s的相鄰段
int i = 0;
while (i <= n - 2 * s) {
// 歸並兩個大小為s的相鄰段
Merge(x, y, i, i+s-1, i+2*s-1);
i = i + 2 * s;
}
// 剩下不足2個元素
if (i + s < n) Merge(x, y, i, i+s-1, n-1);
else for (int j = i; j <= n-1; j++)
// 把最後一段復制到y
y[j] = x[j];
}
void Merge(int c[], int d[], int l, int m, int r)
{// 把c[l:m]] 和c[m:r] 歸並到d [ l : r ] .
int i = l, // 第一段的游標
j = m+1, // 第二段的游標
k = l; // 結果的游標
//只要在段中存在i和j,則不斷進行歸並
while ((i <= m) && (j <= r))
if (c[i] <= c[j]) d[k++] = c[i++];
else d[k++] = c[j++];
// 考慮余下的部分
if (i > m) for (int q = j; q <= r; q++)
d[k++] = c[q];
else for (int q = i; q <= m; q++)
d[k++] = c[q];
}
請問int *b = new int [n]; //?????有沒有內存洩露,如果有如何修改
1. 是存在一個內存洩漏的,從程序看,b是一個臨時緩沖數組,而且在函數內部new出來,從頭至尾並未釋放。需要在函數末尾加入:delete[] b;
2. 可以嘗試從 http://wyw.dcweb.cn/下載NVWA, 有一個內存檢測工具。
g++ yourcode debug_new.cpp, 運行程序就會檢測出問題:
說真的,那個我也加過,程序不報錯,但是無法運行了