我正在为我的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
它工作正常,虽然排序也应该删除...任何提示?
答案 0 :(得分:3)
array
返回其sorted
参数的副本。
因此,array
指向与array
相同的数组。因此,删除sorted
后,std::vector
指向已删除的数组。它不再指向有效的对象。
删除未指向对象的指针具有未定义的行为。
经验法则:每个新版本只需删除一个。你曾打过一次新电话。两次调用删除不止一次。
另一个经验法则:不要直接分配内存。您可以使用int sum = counts.stream().flatMapToInt(array -> IntStream.of(array)).sum();
代替。