当非预期时,C ++程序挂起输入

时间:2013-12-10 08:25:09

标签: c++ arrays sorting

我正在编写简单的学校计划,展示选择排序。我正在填充数组 使用rand()函数,但在输入数组程序的长度后挂起输入。当我输入一些废话(字符或字符串)时,程序用零数组执行。

以下是代码:

 /*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;
}

我正在使用启用了-o3优化的G ++编译器。万分感谢答案。 Adam Rychter

1 个答案:

答案 0 :(得分:2)

首先,删除此行

system("clear");

其次,改变这一点,

free((void*) array);

要,

delete []array;

如果您使用new,那么您将按delete解除分配空间。如果您使用malloc,那么您将按free解除分配空间。在两者之间混淆将导致问题。

更喜欢使用new/delete而不是malloc/free

根据C++ FAQ Lite

  

[16.4]为什么我应该使用new而不是值得信赖的旧malloc()?

     

FAQ:new / delete调用构造函数/析构函数;新的是类型安全的,   malloc不是; new可以被一个类覆盖。

     

FQA:常见问题解答中提到的新优点不是美德,因为   构造函数,析构函数和运算符重载都是垃圾(参见   当你没有垃圾收集时会发生什么?)和类型   安全问题在这里很小(通常你必须抛出虚空*   由malloc返回到右指针类型以将其分配给键入的类型   指针变量,这可能很烦人,但远非“不安全”。)

     

哦,使用值得信赖的旧malloc可以使用   同样值得信赖的旧的realloc。太糟糕了,我们没有一个闪亮的新   运营商更新等等。

     

尽管如此,新的还不足以证明偏离共同点   整个语言中使用的样式,即使语言是C ++。在   特别是,具有非平凡构造函数的类将会出错   如果你只是malloc对象的致命方式。那么为什么不使用新的   整个代码?人们很少超载操作员新的,所以它   可能不会过多地妨碍你。如果他们确实过载新的,   你可以随时要求他们停下来。