【问题标题】:Segmentation fault when remove duplicate value in pointer array删除指针数组中的重复值时出现分段错误
【发布时间】:2021-11-16 12:05:45
【问题描述】:

调试的时候发现从临时数组(b)复制到原始数组(a)后出现分段错误,不知道怎么解决,各位大神能帮帮我吗?

#include <iostream>
using namespace std;

int main() {
    int n;
    cout << "n = ";
    cin >> n;
    int *a = new int[n];
    
    for (int i = 0; i < n; i++)
        cin >> a[i];

    cout << "\nNumber to remove: ";
    int k;
    cin >> k;

    for (int i = 0; i < n; i++)
    {
        while (a[i] == k && i < n - 1)
        {
            int *b = new int[n]{0};
            for (int j = 0; j < i; j++)
                b[j] = a[j];
            for (int j = i + 1; j < n; j++)
                b[j - 1] = a[j];

            a = NULL;
            delete a;
            n--;
            int *a = new int[n];
            for (int j = 0; j < n; j++)
                a[j] = b[j];
        }
    }

    cout << "Result: ";
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
}

【问题讨论】:

  • int *a = new int[n]; 在循环内必须是 a = ...。您正在声明一个 new a,它与循环外部的 a 无关。 (循环外部的第一个a 将在循环结束时为NULL,并且不再更改。
  • a = NULL; delete a; - 你希望它如何工作?
  • TBH 使用std::vector 会更易读。
  • @Chí Bằng Hoàng 错误的原因是糟糕且过于复杂的代码。要从数组中删除一个值,不需要在每次删除目标值时动态分配一个辅助数组。
  • @MSalters 效果很好。问题是存在内存泄漏。:)

标签: c++


【解决方案1】:

这个实现的问题在于:

a = NULL;
delete a;

当您使用delete 关键字时,您是在告诉编译器释放由new 关键字分配的内存,在这种情况下您有a,它是指向int *a = new int[n]; 分配的内存的指针。 a 此时可能是一个 32 位地址,例如 0xbfebd5c0,我说可能是因为它取决于机器的体系结构,但是......之后你将 a 设置为 NULL 导致 a是0x0,在下一个while 条件检查a 是NULL 并且由于操作系统强加的安全原因而访问0x0 + i 是不可能的(没有人允许您访问此位置)。您的具体问题的解决方案是删除 a = NULL; 和 delete a;,因为这两个操作都会干扰 while 条件检查。

我建议采用另一种方法来解决此问题,因为您确实不需要进行这么多的动态分配。

【讨论】:

  • 虽然删除a = NULL; 的答案是正确的,但解释却不是。删除空指针完全没问题。但是您是正确的,删除​​任意地址会导致错误。空指针在这方面是特殊的。
  • 哦,是的,你完全正确,真正的原因是他正在循环一个依赖于a 的条件,因此访问了一些相对于 0x0 的移位位置,他不允许这样做做。谢谢@churill
猜你喜欢
  • 1970-01-01
  • 2018-06-16
  • 2020-06-30
  • 1970-01-01
  • 2021-12-22
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
相关资源
最近更新 更多