如何删除指向动态分配对象的指针数组 这是我试图使用的代码,编译时,在Turbo C++中给出了意外的结果,但是程序在DEVC++中崩溃了,经过一些反复试验,我发现关键字删除会引起问题,但是我无法找出如何纠正错误。谁能找出程序中的错误并给我解释一下吗。 还有,有人能告诉我如何使用智能指针编写相同的代码吗

如何删除指向动态分配对象的指针数组 这是我试图使用的代码,编译时,在Turbo C++中给出了意外的结果,但是程序在DEVC++中崩溃了,经过一些反复试验,我发现关键字删除会引起问题,但是我无法找出如何纠正错误。谁能找出程序中的错误并给我解释一下吗。 还有,有人能告诉我如何使用智能指针编写相同的代码吗,c++,delete-operator,C++,Delete Operator,代码如下: #include<iostream.h> #include<process.h> class list1 { public: virtual void getdata() { } virtual ~list1() { cout<<endl<<"Destructor list1 called " ; } virtual void display() {

代码如下:

#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;
}
#包括
#包括
类别列表1
{
公众:
虚拟void getdata()
{ }
虚拟列表1()
{ 

不能你没有检查边界

list1* ptr[3];
ptr最多有3个元素,如果你加入更多元素,你就有可能踩到其他东西上。(谁知道你的数组后面是什么?)

与此相同。如果按y键的次数比按delete键的次数多,而按create键的次数少,则将在数组开始之前删除内容,谁知道其中有什么?可能是无效指针,这将导致运行时错误

编辑

我说的是个问题,但尼科斯C.有正确的答案

delete ptr[n] 
将访问未初始化的内存。删除前需要递减


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

您没有进行边界检查

list1* ptr[3];
ptr最多有3个元素,如果你加入更多元素,你就有可能踩到其他东西上。(谁知道你的数组后面是什么?)

与此相同。如果按y键的次数比按delete键的次数多,而按create键的次数少,则将在数组开始之前删除内容,谁知道其中有什么?可能是无效指针,这将导致运行时错误

编辑

我说的是个问题,但尼科斯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
循环中,如果
n<0
,则应停止删除

你应该考虑使用<代码> STD::vector ,但是

你的问题是:

delete ptr[n];
n--;
n
是超过数组末尾的索引。必须先减小它,然后删除它:

n--;
delete ptr[n];
或者,简而言之:

delete ptr[--n];
此外,由于数组不能容纳三个以上的元素,因此应引入溢出检查。此外,在第二个
while
循环中,如果
n<0
,则应停止删除


你应该考虑使用<代码> STD::vector ,但是.< /p> 如果要摆脱数组所消耗的堆空间,请使用:

delete [] ptr;
否则,如果只想逐个删除数组指针,则需要更改行:

delete ptr[n];
n--;
致:


我不认为您在试错检查过程中可能按了太多的“y”,但是,如果这是原因,那么只要
n
变为
0

就可以通过中断循环来改进循环。如果您想消除数组消耗的堆空间,请使用:

delete [] ptr;
否则,如果只想逐个删除数组指针,则需要更改行:

delete ptr[n];
n--;
致:


我不认为您在尝试和错误检查期间可能按了太多的“y”,但是,如果这是原因,那么在
n
变为
0

@greatwolf谢谢您……:)不确定这是否是您的问题,但删除数组的正确方法是
delete[]数组
您没有初始化
ptr
删除ptr[n];
可以访问越界索引。您好,取消定义行为。不要手动删除它们。使用RAII替代方法。@greatwolf谢谢您…:)不确定这是否是您的问题,但删除数组的正确方法是
delete[]数组
您没有初始化
ptr
。另外
删除ptr[n];
可以访问越界索引。您好,取消定义行为。不要手动删除它们。使用RAII替代方法。谢谢,检查数组边界后Dominic我的程序运行良好。谢谢,Dominic检查数组边界后我的程序运行良好。谢谢Nikos,更正此错误后,我的程序运行良好。谢谢Nikos,aft呃纠正这个错误,我的程序运行正常。谢谢Sankalp,我已经纠正了我的程序,运行正常。谢谢Sankalp,我已经纠正了我的程序,运行正常。