繁体   English   中英

在C ++中删除指针数组时析构函数崩溃

[英]Destructor crashing when deleting an array of pointers in C++

我做了一个叫做cell的课。 在此类内部,有一个cell指针数组。 标头看起来像这样:

class cell
{       
 public:
  cell();
  cell *c[8];
  void creatcells();
  virtual ~cell();
  ..

}

cpp文件如下所示:

cell::cell()
{
//ctor
 for(int i=0;i<8;i++)
 {
   c[i]=NULL;
 }

}


void cell::creatcells()

 {
   cell c1,c2,c3,c4,c5,c6,c7,c8;

   c[0]=&c1;
   c[1]=&c2;
   c[2]=&c3;
   c[3]=&c4;
   c[4]=&c5;
   c[5]=&c6;
   c[6]=&c7;
   c[7]=&c8;
 }

cell::~cell()
{
    for(int i=0; i<8; i++)
    {
        if (c[i]!=NULL)
        {
                    delete c[i];
        }
    }
    delete[] c;

 }

但是,每次程序结束时,它都会崩溃,为什么呢?
我尝试不使用if (c[i]!=NULL) ,但这没有帮助。 只有没有for循环,代码才能完美结束,但是我知道也必须删除它。 我认为我正确地编写了析构函数,不是吗?

void cell::creatcells()
 {
   cell c1,c2,c3,c4,c5,c6,c7,c8;

   c[0]=&c1;
   c[1]=&c2;
   ...

上述所有cell对象都会在createcells()的末尾自动销毁。 createcells() delete c[i]; createcells() 在析构函数中是UB。您想要的是

 c[0]= new cell();
 c[1]= new cell();

您正试图取消对具有自动存储持续时间并且不再属于范围的变量的指针的引用并delete它们! 您的编译器没有警告您吗?

因此,程序的行为是不确定的

永远只能配对delete[]new[]delete一个new ; 尽管您可以将delete (甚至是new 1 )委托给托管指针类,例如std::unique_ptr

为什么不重构为std::vector<cell>并利用返回值优化


1使用std::make_unique

cell::createcells函数中,变量是局部变量,超出范围,一旦函数返回,它们将被销毁。 当您尝试删除这些对象时,这些对象将不存在。 取消引用那些指针将导致未定义的行为

更不用说您应该只delete new 而且,由于你没有new东西做delete的指针再次导致不确定的行为

简单的解决方案是使用对象 向量

std::vector<cell> c;

然后只需将八个cell对象添加到向量中:

void cell::creatcells()
{
    c = std::vector<cell>(8);
}

现在,向量将包含八个默认构造的cell对象。 无需在构造函数或析构函数中进行任何操作。 实际上,我建议您完全按照零规则删除构造函数和析构函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM