【发布时间】: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