c++分段错误:将字符串传递给链表中的节点
C++ Segmentation Fault: Passing a string to a node in a linked list
我刚开始使用类模板,我只是试图在与链表相关的类中定义一个临时节点'temp',它将节点存储的字符串设置为通过用户输入在函数TowerHanoi::set_Discs(size_t disc)
中创建的一些临时字符串。当我调用函数temp->set_data(tmp_str)
时,我得到一个分段错误。我试着自己打电话给temp->set_data("hello");
,我仍然得到错误。我不确定这里发生了什么,我试着研究了一下,但无济于事。我可能错过了一些明显的东西,但我现在完全迷路了。如果你需要更多代码,请告诉我。谢谢。
TowerHanoi.cpp:
#include "TowerHanoi.h"
#include <iostream>
#include <cstdlib>
using namespace std;
using oreilly_A2::node;
namespace oreilly_A2 {
TowerHanoi::TowerHanoi() {
for (int i=0;i<2;i++) {
rod[i] = LStack<node<std::string> >();
}
}
TowerHanoi::TowerHanoi(size_t numDiscs) {
for (int i=0; i < 2; i++) {
rod[i] = LStack<node<string> >();
}
discs = numDiscs;
}
void TowerHanoi::set_Discs(size_t disc) {
node<string>* temp=NULL;
while (disc != 0) {
string tmp_str;
for (size_t i=0; i<disc; i++) {
tmp_str.append("x");
}
disc--;
temp->set_data(tmp_str);
rod[0].push(temp);
}
void TowerHanoi::print_Game() {
for (size_t s=1; s<discs; s++) {
cout << " ";
for (size_t o=1; o<discs-s;o++) {
cout << " ";
}
//cout << tmp_node->data() << endl;
cout << "x" << endl;
}
}
}
node.h文件:
#ifndef NODE_CAMERON_H
#define NODE_CAMERON_H
#include <string>
namespace oreilly_A2 {
template <typename Item>
class node {
public:
node(); //constructor for node
node(const Item val, node* newNext); //constructor with parameters
~node(); //destructor
void set_data(Item new_data); //set the word that this node contains
void set_link(node* new_link); //set the 'next' node
void set_previous(node* new_prev);
Item data() const; //return this node's word
const node* link() const; //return next
const node* back() const;
node* link(); //return next
node* back();
private:
node* next; //the next node
node* previous;
Item word; //the word this node contains
};
}
#include "Node.template"
#endif
节点。模板文件:
namespace oreilly_A2 {
template <typename Item>
node<Item>::node() {
next=NULL;
previous=NULL;
}
//Node.template
template <typename Item>
node<Item>::node(const Item val, node* newNext=NULL) {
word = val;
next = newNext;
}
template <typename Item>
node<Item>::~node() {
delete next;
delete previous;
delete word;
}
template <typename Item>
void node<Item>::set_data(Item new_data){
word = new_data;
}
template <typename Item>
void node<Item>::set_link(node* new_link){
next = new_link;
}
template <typename Item>
void node<Item>::set_previous(node* new_back) {
previous = new_back;
}
template <typename Item>
Item node<Item>::data() const { //return the word
return word;
}
template <typename Item>
const node<Item>* node<Item>::link() const { //return next node (const function)
return next;
}
template <typename Item>
const node<Item>* node<Item>::back() const { //return previous node (const)
return previous;
}
template <typename Item>
node<Item>* node<Item>::link() {
return next; //return next node (non-const)
}
template <typename Item>
node<Item>* node<Item>::back() { //return previous node (const)
return previous;
}
}
除非我错过了一些temp
变量在调用set_data
时是NULL
。和任何普通对象一样,你需要先初始化它。
node<string>* temp=new node<string>();
然后在适当的时候释放它,以避免内存泄漏。
这不是temp_str
的情况,因为后者不是指针,它是一个值,所以它被自动初始化(当它超出作用域时也会自动释放)。
已初始化temp as NULL
。所以当你试图做temp->set_data(tmp_str);
时,你实际上是在试图访问NULL指针。
您需要做的就是初始化temp
。我更正了
void TowerHanoi::set_Discs(size_t disc) {
node<string>* temp=new node<string>();
while (disc != 0) {
string tmp_str;
for (size_t i=0; i<disc; i++) {
tmp_str.append("x");
}
disc--;
temp->set_data(tmp_str);
rod[0].push(temp);
}
为避免内存泄漏,您需要在完成后删除分配的所有内存。
相关文章:
- 如何按数字顺序插入链表节点?
- 插入一个基本的单向链表节点似乎破坏了我的 c++ 代码?
- 在 c++ 中,在链表节点上使用括号有什么意义?
- C++链表节点是指它自己
- 不显示链表节点
- 如何取消引用作为指针的链表节点数据
- 删除链表节点,C++函数不起作用
- 基本C++链表节点和指针探针
- 链表节点上的分段错误
- 链表节点合并器函数
- 如何将链表节点中的值相加,C++
- 释放链表节点时出现分段错误
- 链表节点类中的链接数
- 链表 c++ 节点构造函数
- 当链表节点是用"new"构造时,如何删除列表?
- 双向链表节点的下一个是私有的
- 分段 C++中链表节点分配的错误
- 双向链表节点交换问题
- 在单向链表中添加双向链表节点
- 关于链表节点的说明