这是我试图使用的代码,它的编译但在turbo c ++中给出了意想不到的结果,但程序在开发C ++中崩溃,经过一些试验和错误后,我发现关键字delete导致了问题,但我无法找出如何纠正错误。有人可以找出程序中的错误并向我解释。 另外,有人可以告诉我如何使用智能指针编写相同的代码吗?
以下是代码:
#include<iostream.h>
#include<process.h>
class list1
{
public:
virtual void getdata()
{ }
virtual ~list1()
{
cout<<endl<<"Destructor list1 called " ;
}
virtual void display()
{ }
};
class list2: public list1
{
public:
int data;
void getdata()
{
cout<<endl<<"Enter the data " ;
cin>>data ;
}
void display()
{
cout<<endl<<data ;
}
~list2()
{
cout<<endl<<"Destructor list2 called" ;
}
};
int main()
{
list1* ptr[3]; //array of pointers
char ch = 'y';
int n = 0;
while(ch=='y')
{
ptr[n] = new list2 ;
ptr[n]->getdata() ;
n++ ;
cout<<endl<<"Do you want to enter more of data " ;
cin>>ch ;
cout<<endl<<"The no of items currently added are: "<<n ;
}
ch='y';
while(ch=='y')
{
delete ptr[n];
n--;
cout<<endl<<"Item deleted " ;
cout<<endl<<"Do you want to delete more elements " ;
cin>>ch ;
cout<<endl<<"The no of items currently in the list are "<<n ;
}
int i = 0;
while(i < n)
{
ptr[i]->display() ;
i++ ;
}
cout<<endl ;
system("pause") ;
return 0;
}
答案 0 :(得分:2)
你没有受到检查。
list1* ptr[3];
ptr最多有3个元素,如果你加入更多元素,你就有可能踩到其他东西。 (谁知道你的阵列后面是什么?)
while(ch=='y')
{
delete ptr[n];
与此相同。如果你按y比删除的次数多于按下创建的次数,你将在数组开始之前删除内容,谁知道那里有什么?它可能是无效的指针,这就是导致运行时错误的原因。
修改
我说的是一个问题,但Nikos C.有正确的答案。
delete ptr[n]
将访问未初始化的内存。您需要在删除之前递减
因此,如果你按y分配n将为0并放入ptr [0],但当你按y解除分配时n将为1而ptr [1]将被删除,这是未分配的。
答案 1 :(得分:2)
你的问题是:
delete ptr[n];
n--;
n
是过去数组末尾的索引。您必须先减小它,然后将其删除:
n--;
delete ptr[n];
或简称:
delete ptr[--n];
此外,您应该引入溢出检查,因为该数组不能容纳三个以上的元素。此外,在第二个while
循环中,您应该停止删除n < 0
。
您应该考虑使用std::vector
代替。
答案 2 :(得分:0)
如果要删除阵列消耗的堆空间,请使用:
delete [] ptr;
否则,如果你只是想逐个删除数组指针,那么你需要更改你的行:
delete ptr[n];
n--;
为:
n--;
delete ptr[n];
我不认为你在审判和错误检查过程中可能会过多地按'y',但是,如果这就是原因,那么在n
之后立即通过突破来改进你的循环变为0
。