1

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

3 回答 3

2

你不是边界检查。

list1* ptr[3];

ptr 最多有 3 个元素,如果你放的更多,你有可能踩到其他东西。(谁知道你的数组后面是什么?)

while(ch=='y')
{
    delete ptr[n];

这也是一样。如果您按 y 的次数比按 delete 的次数多于按 create 的次数,您将在数组开始之前删除东西,谁知道那里有什么?它可能是无效的指针,这就是导致您的运行时错误的原因。

编辑

我说的是一个问题,但 Nikos C. 有正确的答案。

delete ptr[n] 

将访问未初始化的内存。删除前需要先递减

因此,如果您按 y 分配一次,n 将为 0 并被放入 ptr[0],但是当您按 y 取消分配时,n 将为 1,并且未分配的 ptr[1] 将被删除。

于 2013-07-15T03:17:31.733 回答
2

你的问题是这样的:

delete ptr[n];
n--;

n数组末尾之后的索引。您必须先减少它,然后再删除它:

n--;
delete ptr[n];

或者,简称:

delete ptr[--n];

此外,您应该引入溢出检查,因为数组不能容纳超过三个元素。此外,在第二个while循环中,您应该停止删除 if n < 0

你应该考虑std::vector改用。

于 2013-07-15T03:21:48.557 回答
0

如果您想摆脱阵列消耗的堆空间,请使用:

delete [] ptr;

否则,如果您只想一一删除数组指针,则需要更改行:

delete ptr[n];
n--;

至:

n--;
delete ptr[n];

我认为您在试错检查过程中可能不会按太多“y”,但是,如果这是原因,那么一旦n成为0.

于 2013-07-15T03:22:15.733 回答