2013-12-10 25 views
1

我在寫簡單的學校程序來演示選擇排序。我正在使用rand()函數填充數組 ,但在輸入數組程序的長度後會掛起以進行輸入。當我輸入一些無用的(字符或字符串)程序與零數組執行。C++程序在非打算輸入時掛起

下面是代碼:

/*Selection sort implementation- 
    Autor: Adam Rychter 
    09/12/13*/ 

#include<iostream> 
#include<cstdlib> 
#include<ctime> 

using namespace std; 

int* selection_sort(int array[], int length); 

int main(void) { 
    int length, num; 
    int* array; 

    cout << "Enter the length of array to sort: "; 
    cin >> length; 

    array = new int[length]; 

    for(int i = 0; i < length; i++) { 
     num = rand(); 
     array[i] = num; 
    } 

    int *sorted_array_ptr = selection_sort(array, length); 

    system("clear"); 

    cout << "Sorted array:" <<endl; 

    for(int i = 0; i < length; i++) { 
     cout << " " << sorted_array_ptr[i]; 
    } 

    free((void*) array); 

    cout << "\n"; 
} 

int* selection_sort(int array[], int length) { 

    for(int i = 0; i < length; i++) { 

     int max_index = i; 

     for(int j = i + 1; j < length; j++) { 

      if(array[j] > array[max_index]) { 
       max_index = j; 
      } 
     } 

     int tmp = array[i]; 
     array[i] = array[max_index]; 
     array[max_index] = tmp; 
    } 
    return array; 
} 

啓用-03優化我使用的G ++編譯器。千謝謝你的回答。 亞當Rychter

+3

結合使用** new/delete **,** malloc/free **。 – David

+1

至user1920482 - 非常感謝!必須寫一些備忘單C與C++ – stryke404

+0

C和C++沒有區別。 C輸入函數如'getc(stdin)'仍然以C++工作。 使用不同的函數,例如'istream :: operator >>()'(這就是你在編寫'cin >>長度時所調用的)'')當然會使用該函數的特定行爲。 – Peter

回答

2

首先,刪除此行

system("clear"); 

其次,改變這一狀況,

free((void*) array); 

到,

delete []array; 

如果使用new,那麼你會取消分配由delete的空間。如果您使用malloc,那麼您將通過free釋放空間。兩者混合會導致問題。

優選使用new/delete而不是malloc/free

C++ FAQ Lite

[16.4]我爲什麼要使用新的,而不是值得信賴的malloc()?

FAQ:new/delete調用構造函數/析構函數;新是類型安全的, malloc不是;新的可以被一個類覆蓋。

常見問題解答:新通過的FAQ中提到的美德是不是美德,因爲 構造函數,析構函數和運算符重載都是垃圾(見 時,你有沒有垃圾回收會發生什麼?),以及 類型安全問題(通常你必須將malloc返回的void * 轉換爲正確的指針類型,將它分配給一個類型爲 的指針變量,這可能很煩人,但遠非「不安全」)。

哦,並且使用值得信賴的舊malloc使得使用 同樣值得信賴的&舊realloc。太糟糕了,我們沒有一個閃亮的新運營商更新 什麼的。

儘管如此,即使語言是C++,新語言也不足以證明在語言中使用的風格偏離了常見的風格。在 特別是,如果你只是malloc的對象,具有非平凡構造函數的類將會以致命的方式行事不端。那麼爲什麼不在整個代碼中使用新的 ?人們很少重載運營商新的,所以它可能不會太多你的方式。如果他們超載新的,你總是可以讓他們停下來。

+0

@Abhineet正確地閱讀了這個問題的意見,這有助於OP。這是解決方案。 – gldraphael