删除指向已排序字符串数组的指针会在运行后出错

时间:2017-12-28 19:30:32

标签: c++ arrays sorting dynamic-memory-allocation

我正在为我的alg类练习排序和指针 - 这是一个简单的程序,要求用户输入一个希望输入的名字数量,然后询问这些名称,然后对其进行排序。

string *sortname(string array[], int number)
{
    for (int i = 0; i < number - 1; i++)
    {
        int smallestIndex = i;
        for (int j = i + 1; j < number; j++)
        {
            if (array[smallestIndex] > array[j])
                smallestIndex = j;
        }
        swap(array[i], array[smallestIndex]);
    }

    return array;
}

int main()
{
cout << "enter the number of names you wish to enter." << endl;

int number;
cin >> number;

string *array = new string[number];

for (int i = 0; i < number; i++)
{
    cout << "enter name #" << i+1 << ":";
    cin >> array[i];
}

cout << "the names are: " << endl;
for (int i = 0; i < number; i++)
{
    cout << array[i] << endl;
}

string *sorted; 
sorted = sortname(array, number);

cout << "the sorted names are: " << endl;
for (int i = 0; i < number; i++)
{
    cout << sorted[i] << endl;
}

delete[] array;
delete[] sorted;

return 0;
}

我知道函数sortname可以设置为void并且不返回任何内容,但我只是想尝试返回(为了练习)。 但是,当我最后添加delete[] sorted时,控制台在列出已排序的名称后崩溃。如果我只是delete[] array它工作正常,虽然排序也应该删除...任何提示?

1 个答案:

答案 0 :(得分:3)

array返回其sorted参数的副本。

因此,array指向与array相同的数组。因此,删除sorted后,std::vector指向已删除的数组。它不再指向有效的对象。

删除未指向对象的指针具有未定义的行为。

经验法则:每个新版本只需删除一个。你曾打过一次新电话。两次调用删除不止一次。

另一个经验法则:不要直接分配内存。您可以使用int sum = counts.stream().flatMapToInt(array -> IntStream.of(array)).sum(); 代替。