析构函数被提前调用

Dav*_*ave 2 c++

我有一个队列类,其中我试图动态分配3个"示例"对象并将它们放入队列,然后出列并删除它们.但是样本对象的析构函数:

~Sample() { cout << "Destructing Sample object " << id << "\n"; }
Run Code Online (Sandbox Code Playgroud)

由于某种原因,当我尝试将对象放在队列中时被调用.

int main()
{
   Sample *samp1;
   Sample *samp2;
   Sample *samp3;
   Queue<Sample> sQa(3);
   samp1 = new Sample(1);
   samp2 = new Sample(2);
   samp3 = new Sample(3);

   cout << "Adding 3 Sample objects to queue...\n";

   sQa.put(*samp1);
   sQa.put(*samp2);
   sQa.put(*samp3);

   cout << "Dequeing and destroying the objects...\n";

   for(int i = 0; i < 3; ++i)
   {
       delete &sQa.get();
   }

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

Adding 3 sample objects to queue...
Destructing Sample object 1
Destructing Sample object 2
Destructing Sample object 3
Dequeing and destroying the objects...
Destructing Sample object 1
Run Code Online (Sandbox Code Playgroud)

然后程序崩溃了.谁知道为什么会这样?此外,这是必要的put函数.(队列类是模板)

void put(Qtype data) 
{
    if(putloc == size) 
    {
        cout << " -- Queue is full.\n";
        return;
    }

    putloc++;
    q[putloc] = data;   
}
Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 10

您的代码会导致未定义的行为.它调用delete一个未使用动态分配的对象new.

附:

sQa.put(*samp1);
Run Code Online (Sandbox Code Playgroud)

您存储动态分配的成员的副本sQa.按值复制对象后,丢失了指向动态分配对象的指针.

解决方案是使用智能指针作为容器元素,让RAII为您完成所有内存管理工作.