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

时间:2013-07-15 02:50:13

标签: c++ delete-operator

这是我试图使用的代码,它的编译但在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;
}

3 个答案:

答案 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