分段错误推送堆栈中的字符串

时间:2015-10-14 04:50:23

标签: c++ string class templates

我仍然坚持使用模板和基于链接列表的堆栈的类分配不断发生的问题。我不断得到分段错误,我不能为我的生活看到原因。

main()要求一个值来确定玩游戏的磁盘数量,调用set_Discs(),它将" x" s附加到字符串对象{{1}代表游戏的磁盘。然后将该字符串对象推入堆栈tmp_str(第一个杆),然后循环回来。我每次通过循环调用rod[0]来打印顶层堆栈对象作为测试并且它可以工作,因此我可以成功存储字符串对象。但是,在调用下一个函数cout时,它会执行for循环的第一次迭代(打印第一行)并再次破坏。

print_Game()

int main() { TowerHanoi game; size_t disc_in; //How many discs to be used cout << "Welcome to Towers of Hanoi!"<< "Please enter how many discs you want to play with: " << endl; cin >> disc_in; game.set_Discs(disc_in); game.print_Game(); //Ask for source and target rod return EXIT_SUCCESS; } 功能:

set_Discs()

函数 void TowerHanoi::set_Discs(size_t disc) { //cout << "test: " << rod[0].top() << endl; discs = disc; while (disc > 0) { string tmp_str; for (size_t i=0; i<disc; i++) { tmp_str.append("x"); } disc--; rod[0].push(tmp_str); cout << "test: " << rod[0].top() << endl; } } 是最近的逻辑努力,如果它不好并且工作不足,请原谅我。循环添加间距,然后打印print_Game()字符串对象,然后调用top(调用pop()中的removeFromHead())使下一个字符串对象成为下一个字符串对象通过循环的时间,等等。请参阅LinkedList.template

addToHead()

来自LStack.template的一些相关代码(这是堆栈):

    void TowerHanoi::print_Game() {

    size_t spaces = discs;
    string topLen = rod[0].top();
    string xString;

    cout << "top length: " << topLen.length() << endl;
    for (size_t a=0; a<discs;a++) {
        LStack<string> rodCopy = rod[0];
            cout << "==="; //3 spaces
                for (size_t i=0; i<spaces-topLen.length();i++) { //add to xString
                    xString.append("=");
                }

                cout << "===" << xString << rod[0].top() << xString << endl;
                rod[0].pop(); 
                spaces--;
    }



}

来自LinkedList.template的相关代码:

    //push
template <typename Obj>
void LStack<Obj>::push(Obj& head_in) {

    list->addToHead(head_in);
    used++;
}

//pop
template <typename Obj>
Obj LStack<Obj>::pop() {
    used--;
    return list->removeFromHead();

}
//top
template <typename Obj>
const Obj& LStack<Obj>::top() {
    return list->list_getHead();
}

Node.template:

template <typename Item>
void LinkedList<Item>::addToHead(Item& entry) {
    node<Item>* temp = head;
    head = new node<Item>();
    head->set_data(entry);
    head->set_link(temp);

}

    template <typename Item>
const Item& LinkedList<Item>::removeFromHead() {
    node<Item>* head_copy = head; //create a copy of head
    head->set_data(head_copy->link()); //set head's data to the previous object
    return head_copy->data(); //return head's original data
}

1 个答案:

答案 0 :(得分:0)

识别正在堆叠上推送的数据:

void TowerHanoi::set_Discs(size_t disc) 
{
    while (disc > 0) 
    {
        string tmp_str;               <-- note here, tmp_str is stack variable
        rod[0].push(tmp_str);
    }
}

现在,让我们看一下LStack :: push()函数:

//push
template <typename Obj>
void LStack<Obj>::push(Obj& head_in)   <-- note here, input to push() is pass by reference
{
    list->addToHead(head_in);
    used++;
}

一旦set_Discs()函数调用完成,对此函数内使用的堆栈变量的引用无效。

当调用print_Game()函数并使用LStack存储数据时,这可能与程序崩溃/突然终止的问题有关。