尝试对数组进行排序时堆积损坏

时间:2016-02-12 00:30:31

标签: c++ sorting

#include <iostream>
#include <algorithm>

bool wayToSort(int i, int j) { return i > j; }
bool wayToSortAlt(int i, int j) { return i < j; }

int main()
{
    using namespace std;

    int size = 5;
    int *myArray = new int[size] { 0 };
    int option = 0;

    cout << "How many numbers do you want to enter?: ";
    cin >> size;
    cout << "How do you want to sort? ( [1] Greatest [2] Lowest ): ";
    cin >> option;
    cout << "----\n";

    // Get number inputs
    for (int count = 0; count < size; ++count)
    {
        cout << "Enter a number: ";
        cin >> myArray[count];
    }

    cout << "----\nSorted:\n----\n";

    // Sort for highest numbers
    if (option == 1)
        sort(myArray, myArray + size, wayToSort);
    else
        sort(myArray, myArray + size, wayToSortAlt);

    // Print each number
    for (int count = 0; count < size; ++count)
    {
        cout << myArray[count] << "\n";
    }

    delete[] myArray;   // Clean up
    myArray = nullptr;  //

    return 0;
}

我在Visual Community 2013中运行此代码,如果我输入一个高数字,如10,我会收到堆损坏错误。根据我的阅读,当您尝试写入未分配的内存地址时会发生堆损坏错误,但我不明白两件事:

1)为什么动态数组会发生这种情况,并且 2)为什么只有在我尝试输入更大的数字时才会发生错误。

1 个答案:

答案 0 :(得分:1)

  1. 卢克 您已经定义了数组的大小。所以它不是动态数组。它是一个指向大小为5的数组的指针,因此最多只能存储5个整数。

  2. 所以你基本上已经分配了足够的空间来容纳5个int。这意味着如果您尝试存储超过5个,例如索引为5的第6个int,则您尝试访问不属于您的内存。 例如,你有:

  3. [] [] [] [] []

    1 2 3 4 5

    很好

    [] [] [] [] []

    1 2 3 4 5 6 7 8 ...

    导致堆损坏。

    我可以建议std :: vector吗?