作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个队列类,我在其中尝试动态分配 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/
我是一名优秀的程序员,十分优秀!