gpt4 book ai didi

c++ - 尝试在 C++ 中实现固定大小队列时出现段错误

转载 作者:行者123 更新时间:2023-12-01 15:12:21 25 4
gpt4 key购买 nike

我想实现一个固定大小的队列,我可以轻松地使用一个具有队列作为数据成员之一和一个负责队列推送部分的成员函数的结构来完成,但我想尝试一下通过像这样继承队列来输出。

template<typename T>
struct f_queue : public queue<T>{
int n;
T prev;

f_queue(int n_):
n(n_){}

void push(T data){
if(this->size() < this->n){
this->push(data);
}else{
prev = this->front();
this->pop();
this->push(data);
}
}
};

这编译得很好,但由于某种原因它给出了段错误并且 gdb 说

Program received signal SIGSEGV, Segmentation fault.0x0000555555555862 in std::_Deque_iterator<int, int&,int*>::_S_buffer_size() ()

不太确定这是什么意思?当尝试进行回溯时,输出为

#9913 0x0000555555554ec6 in f_queue<int>::push(int) ()
#9914 0x0000555555554ec6 in f_queue<int>::push(int) ()
#9915 0x0000555555554ec6 in f_queue<int>::push(int) ()
#9916 0x0000555555554ec6 in f_queue<int>::push(int) ()
#9917 0x0000555555554ec6 in f_queue<int>::push(int) ()
#9918 0x0000555555554ec6 in f_queue<int>::push(int) ()
#9919 0x0000555555554ec6 in f_queue<int>::push(int) ()

永不止息。需要帮助。提前致谢。

最佳答案

你的推送函数总是递归到自身:

void push(T data){
if(this->size() < this->n){
this->push(data);//HERE f_queue::push is called
}else{
prev = this->front();
this->pop();
this->push(data);//HERE f_queue::push is called
}
}

您可能想调用基类的推送:

void push(T data){
if(this->size() < this->n){
queue<T>::push(data);
}else{
prev = this->front();
this->pop();
queue<T>::push(data);
}
}

请注意,STL 容器并不意味着可以公开派生。它们没有虚拟析构函数,因此请确保永远不会通过基类指针/引用进行删除。

编辑

非虚拟析构函数意味着以下代码是危险的:

std::queue<T>* base = new f_queue<T>();
delete base;//Call std::queue<T>::~queue();

无法强制调用正确的析构函数。将 f_queue 的析构函数设为虚拟没有帮助。但是,只要您从不通过指向基类的指针进行删除,从任何类派生都没有问题。

强制执行此操作的一种方法是使用私有(private)继承,但我猜您首先使用继承来保留 std::queue 的大部分 API。

关于c++ - 尝试在 C++ 中实现固定大小队列时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63632805/

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