我有一个队列类,其中我试图动态分配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为您完成所有内存管理工作.
| 归档时间: |
|
| 查看次数: |
548 次 |
| 最近记录: |