【问题标题】:run time error in dynamically allocated array to delete an element in c++动态分配数组中的运行时错误以删除 C++ 中的元素
【发布时间】:2019-01-29 16:20:20
【问题描述】:

我用 C++ 编写了一个程序来删除动态分配数组中的一个元素。我可以看到带有已删除元素的数组,但在那之后,它会产生一些我无法理解的错误。我已将图像包含在错误中,因为我无法复制错误消息。 我正在使用:

Debian 9,32 位

编译器叮当声。

IDE 代码::块。

代码:

#include<iostream>
#include<cstdlib>
using namespace std;

int main()
{
    int *ar,arsize,lp1,lp2,lp3,lp4,ele,pos;
    ar=nullptr;
    cout<<"enter the size of array to be created:- "; cin>>arsize;
    ar=new int[arsize];
    if(!ar)
    {
        cout<<"Aborting";
        exit(1);
    }
    else
    {
    cout<<"enter the elements for array:- ";
    for(lp1=0;lp1<arsize;lp1++)
    {
        cin>>ar[lp1];
    }
    cout<<"Enter element to be deleted:- "; cin>>ele;
    for(lp2=0;lp2<arsize;lp2++)
    {
        if(ar[lp2]==ele)
        {
            ar[lp2]=0;
            pos=lp2;
            break;
        }
    }
    for(lp3=pos;lp3<arsize;lp3++)
    {
        ar[lp3]=ar[lp3+1];
    }
    ar[arsize]=0;
    cout<<"new array is:-"<<endl;
    for(lp4=0;lp4<arsize-1;lp4++)
    {
        cout<<"\t"<<ar[lp4]<<endl;
    }
    delete[]ar;
    return 0;
    }
}

【问题讨论】:

  • Do not use images of errors。正确缩进你的代码。请记住,new 从不返回空指针。避免使用 C 样式的数组和 new [],改用 std::vector
  • 您想跟踪分配的大小和数据大小。如果找不到要删除的项目怎么办?您在几个地方读/写了结尾。您可以使用 memmove 删除。这就是你使用 std::vector 的原因:)
  • 使用sanitizers 快速检查此类错误。 Demo。如果您使用调试信息进行编译,地址清理程序将显示有问题的行号。

标签: c++ c++11 clang c++14 c++17


【解决方案1】:

此代码具有未定义的行为:

 ar[lp3]=ar[lp3+1];

由于lp3 指向最后一个元素,ar[lp3+1]; 超出范围。

还有:

ar[arsize]=0;

写入越界。最大有效索引为arsize-1,因为索引从零开始。最后一行破坏了你的堆。

【讨论】:

    【解决方案2】:

    您正在尝试访问不存在的ar[arsize]

    请记住,C++ 数组的索引为 0。

    所以试试ar[arsize-1]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      • 2011-06-07
      相关资源
      最近更新 更多