运行后删除指向已排序字符串数组的指针会给我一个错误[关闭]

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&lt;std::string&gt; 并按值返回。这将是一个很好的做法,不会有这个问题 【参考方案1】:

sortname 返回其array 参数的副本。

所以,sorted 指向与array 相同的数组。因此,一旦array 被删除,sorted 就会指向该删除的数组。它不再指向一个有效的对象。

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


经验法则:您需要对每个新的进行一次删除。你已经打电话给新的一次。调用 delete 两次是不止一次。

另一个经验法则:永远不要直接分配内存。你可以改用std::vector

【讨论】:

以上是关于运行后删除指向已排序字符串数组的指针会给我一个错误[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

程序的错误输出,使用指向结构数组的指针

C指针:指向一个固定大小的数组

力扣:删除排序数组中的重复项(c++)

删除时出错:表达式必须是指向完整对象类型的指针

为什么这个双链表程序会给我一个空指针异常? [重复]

为啥在将唯一指针插入无序映射时 C++ 会给我一个错误?