【问题标题】:Segmentation Fault: Core dumped; std::deque分段故障:核心转储;标准::双端队列
【发布时间】:2016-09-08 17:24:36
【问题描述】:

对于我的班级,我必须实现一个“List”类,它使用 std::deque 来“建模”List 的功能(不要问我为什么)。这个类需要是一个模板类。

我还读到,如果您在类上使用模板,则头文件和 .cpp 文件中的类的分离有点不同。所以我在头文件中实现了所有内容。

但是,如果我实例化一个“List”对象并使用成员函数“ins”将某些内容附加到我的 List 中,编译后会出现分段错误。

这是我的 .h:

#ifndef LIST_H
#define LIST_H

#include <deque>
#include <iostream>


template <typename T>
class List {

public:
List();
void del();
void ins(T x);
void adv();
void end();
void reset();
void setEnd();
T get();


private:
std::deque<T>deque;
T *pos;
int ptrPos = 0;
T element;
};

template <typename T>
List<T>::List(){};

template <typename T>
void List<T>::ins(T x){
    deque.push_back(x);
    *pos = x;
    ptrPos++;
}

template <typename T>
void List<T>::del(){
    deque.erase(ptrPos);
    *pos = deque.at(ptrPos);
}

template <typename T>
void List<T>::adv(){
    ptrPos++;
    *pos = deque.at(ptrPos);
}

template <typename T>
void List<T>::end(){
    if(ptrPos == deque.size()){
        std::cout << "Der Positionszeiger zeigt auf das Ende der Liste" << std::endl;
    }else{
        std::cout << "Der Positionszeiger zeigt NICHT auf das Ende der Liste" << std::endl;
    }
}

template <typename T>
void List<T>::setEnd(){
    ptrPos = deque.size();
    *pos = deque.at(ptrPos);
}

template <typename T>
T List<T>::get(){
   return deque.at(ptrPos); 
}

template <typename T>
void List<T>::reset(){
    *pos = deque.at(1);
    ptrPos = 1;
}

#endif  /* LIST_H */

还有我的 main.cpp:

#include <cstdlib>
#include "List.h"

using namespace std;

/*
 * 
 */
int main(int argc, char** argv) {

    List <int> ListInt;




    ListInt.ins(5);

    return 0;
}

感谢任何形式的帮助或建设性的批评。 另外,如果缺少任何重要的东西,请不要犹豫,让我知道。

最好的问候,

德特

【问题讨论】:

  • 去掉 posptrPos 并用 deque::iterator 替换两者。
  • 好吧,您是否使用调试器逐步检查代码以缩小SEGFAULT 实际出现的行? “建设性批评”到此为止。
  • 你能在 gdb 下运行它并获得堆栈跟踪吗?我认为您误用了pos ptr through。 *pos = x 正在尝试将 x 分配给 pos 指向的内容。我认为您想使用pos = &amp;xx 的地址分配给pos

标签: c++ list templates deque


【解决方案1】:

您的问题是*pos = x; 而不是std::deque。当你构造 ListInt 时,你使用默认构造函数,它不会初始化 pos。当您执行 *pos = x; 时,您取消引用未初始化的指针,该指针是未定义的行为并导致崩溃。

我不确定你想用pos 做什么,但看起来你根本不需要指针。

【讨论】:

  • 好吧,我不知道如何获取deque的迭代器的当前位置。例如,我必须实现一个函数,它告诉我迭代器是否在列表的末尾。还有一个将我的列表的迭代器移动 i 的函数。这就是为什么我使用另一个指针和一个计数器,它告诉我我的指针在哪个确切位置。我是初学者,我不知道更好:/
  • @Dethe 你的结局如何? std::deque 可以增长,直到内存不足。
  • 最后我的意思是我的双端队列的最后一个元素
  • @Dethe 可以通过std::distance(deque.begin(), your_iterator); 获取迭代器的位置,如果这是您想要完成的,则不需要pos
猜你喜欢
  • 2016-09-09
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多