运行后删除指向已排序字符串数组的指针会给我一个错误[关闭]
Posted
技术标签:
【中文标题】运行后删除指向已排序字符串数组的指针会给我一个错误[关闭]【英文标题】:deleting a pointer to a sorted string array gives me an error after running [closed] 【发布时间】:2017-12-28 19:30:31 【问题描述】:我正在为我的 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
它工作正常,虽然排序也应该被删除......有什么提示吗?
【问题讨论】:
因为你要双重删除同一个数组。 啊,我明白了,谢谢你,现在很有意义! 我不必对排序的指针做任何事情,因为主数组已被删除。感谢您的帮助 只需传递std::vector<std::string>
并按值返回。这将是一个很好的做法,不会有这个问题
【参考方案1】:
sortname
返回其array
参数的副本。
所以,sorted
指向与array
相同的数组。因此,一旦array
被删除,sorted
就会指向该删除的数组。它不再指向一个有效的对象。
删除不指向对象的指针具有未定义的行为。
经验法则:您需要对每个新的进行一次删除。你已经打电话给新的一次。调用 delete 两次是不止一次。
另一个经验法则:永远不要直接分配内存。你可以改用std::vector
。
【讨论】:
以上是关于运行后删除指向已排序字符串数组的指针会给我一个错误[关闭]的主要内容,如果未能解决你的问题,请参考以下文章