繁体   English   中英

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

[英]Segmentation fault while trying to implement fixed size queue in C++

我想实现一个固定大小的队列,我可以很容易地用一个结构来完成,该结构将一个队列作为数据成员之一和一个负责处理队列推送部分的成员函数,而是想通过继承来尝试它像这样排队。

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 说

程序收到信号 SIGSEGV,分段错误。 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) ()

不会停止去无限。 需要帮助。提前致谢。

您的 push 函数总是递归到自身:

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的析构函数f_queue虚拟将无济于事。 但是,只要您从不通过指向基类的指针进行删除,从任何类派生都没有错。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM