程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言問答 >> 求教一個c語言小問題

求教一個c語言小問題

編輯:C語言問答

求教一個c語言小問題

5

#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, 運行程序就會檢測出問題:

追問:

說真的,那個我也加過,程序不報錯,但是無法運行了

回答:
我這裡運行正常(dev c++ 自帶的g++編譯器),無法解釋你的問題,不好意思,僅供參考:void MergeSort(int a[], int n){     int *b = new int[n];    int s = 1;     while (s < n) {        MergePass(a, b, s, n);        s += s;        MergePass(b, a, s, n);        s += s;    }    delete[] b;}
追問:
哈哈,謝謝了,我發現了,原來我開始把位置放錯了,尴尬,很謝謝
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved