如何解决尝试在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,分段错误。 std :: __ Deque_iterator
:: __ 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) ()
不会停止无限。需要帮助。谢谢。
解决方法
您的推送功能总是递归于自身:
import 'package:flutter/material.dart';
import 'curvesanimations.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',theme: ThemeData(
primarySwatch: Colors.blue,visualDensity: VisualDensity.adaptivePlatformDensity,),home: MyHomeScaffold(
title: "Curved Animation Example",);
}
}
class MyHomeScaffold extends StatelessWidget {
final String title;
MyHomeScaffold({this.title});
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
appBar: AppBar(
title: Text(title),body: CurvedAnimationExample(),);
}
}
您可能打算调用基类的推送:
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
}
}
请注意,STL容器并非旨在公开获得。它们没有虚拟析构函数,因此请确保您永远不要通过基类指针/引用进行删除。
编辑
非虚拟析构函数意味着以下代码很危险:
void push(T data){
if(this->size() < this->n){
queue<T>::push(data);
}else{
prev = this->front();
this->pop();
queue<T>::push(data);
}
}
没有办法强制执行正确的析构函数的调用。将std::queue<T>* base = new f_queue<T>();
delete base;//Call std::queue<T>::~queue();
的析构函数设为虚拟将无济于事。但是,只要您从不通过指向基类的指针进行删除,从任何类派生就没有错。
一种强制实施的方法是使用私有继承,但我想您首先是在使用继承来保留f_queue
的大部分API。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。