gpt4 book ai didi

c++ - 析构函数被提前调用

转载 作者:太空狗 更新时间:2023-10-29 23:26:30 25 4
gpt4 key购买 nike

我有一个队列类,我在其中尝试动态分配 3 个“示例”对象并将它们放入队列中,然后出列并删除它们。但是示例对象的析构函数:

~Sample() { cout << "Destructing Sample object " << id << "\n"; }

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

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;
}

这是输出:

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

然后程序崩溃了。任何人都知道为什么会这样?另外,这里是 put 函数,以备不时之需。 (队列类是模板)

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

putloc++;
q[putloc] = data;
}

最佳答案

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

与:

sQa.put(*samp1);

您将动态分配的成员的拷贝存储在 sQa 中。一旦按值复制对象,就丢失了指向动态分配对象的指针。

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

关于c++ - 析构函数被提前调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16717234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com