如何删除指向动态分配对象的指针数组

How can you delete a array of pointers which points to a dynamically allocated objects

本文关键字:对象 动态分配 指针 数组 何删除 删除      更新时间:2023-10-16

这是我试图使用的代码,它的编译在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时,就可以通过打破它来改进你的循环。