如何删除指向动态分配对象的指针数组
How can you delete a array of pointers which points to a dynamically allocated objects
这是我试图使用的代码,它的编译在turbo c++中给出了意想不到的结果,但程序在dev 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;
}
您不是边界检查。
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]将被删除,这是未分配的。
您的问题是:
delete ptr[n];
n--;
n
是经过数组末尾的索引。你必须先减少它,然后删除它:
n--;
delete ptr[n];
或者,简称:
delete ptr[--n];
此外,应该引入溢出检查,因为数组不能容纳三个以上的元素。此外,在第二个while
循环中,您应该停止删除if n < 0
。
不过,您应该考虑使用std::vector
。
如果您想消除数组所消耗的堆空间,请使用:
delete [] ptr;
否则,如果你只想一个接一个地删除数组指针,那么你需要更改你的行:
delete ptr[n];
n--;
至:
n--;
delete ptr[n];
我不认为你可能在试错检查过程中按了太多"y",但是,如果这是原因的话,那么在n
变成0
时,就可以通过打破它来改进你的循环。
相关文章:
- 对具有动态分配的内存和析构函数的类对象的引用
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 销毁C++中动态分配的内存(数组对象)
- C++ 将抽象类型的动态分配对象传递给函数并存储在向量中
- 动态分配的对象未初始化
- std::p air 会破坏其动态分配的对象吗?
- 动态分配对象中的字段-动态分配更好还是静态分配更好?C++
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 使用私有析构函数删除动态分配的对象
- 动态分配许多 Boost::直方图对象
- 如何使用每个对象的单个构造函数参数动态分配C++对象数组?
- 将动态分配对象传递到 boost::any 构造函数中
- 将动态分配的对象添加到对象指针数组中
- 如何删除列表中的动态分配类对象<T>?
- 处理另一个类中类动态分配的对象数组
- 如何使用一些参数初始化动态分配的数组中的对象
- 使用 new: "potentially uninitialized pointer"将对象数组动态分配给指针
- 如何复制或返回包含动态分配的内存的对象
- C 删除指向动态分配对象的指针