我正在编写双向链接列表,一切都很顺利但是当我在结构中读取字符串值时遇到崩溃(代码行在函数中被注释" struct Node * GetNewNode()&# 34):
#include <iostream>
#include <String>
#include <fstream>
#include <cstdlib>
using namespace std;
struct Node {
int sv;
double real;
bool log;
char simb;
string str;
struct Node* next;
struct Node* prev;
};
struct Node* head; // global variable - pointer to head node.
//----------------------------
struct Node* GetNewNode();
void Initialize(Node *stack);
void InsertAtTail(Node *stack);
void Print(Node *stack);
//----------------------------
//Creates a new Node and returns pointer to it.
ifstream fd("duom.txt");
struct Node* GetNewNode() {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
fd >> newNode->sv;
fd >> newNode->real;
string loginis;
fd >> loginis;
if (loginis == "TRUE")
newNode->log = true;
else
newNode->log = false;
fd >> newNode->simb;
//fd >> newNode->str; //uncommented code in this row crashes the program
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
}
//Inserts a Node at head of doubly linked list
void Initialize(Node *stack) {
stack = head;
}
//Inserts a Node at tail of Doubly linked list
void InsertAtTail(Node *stack) {
struct Node* temp = stack;
struct Node* newNode = GetNewNode();
if(head == NULL) {
head = newNode;
return;
}
while(temp->next != NULL)
temp = temp->next; // Go To last Node
temp->next = newNode;
newNode->prev = temp;
}
//Prints all elements in linked list in reverse traversal order.
void Print(Node *stack) {
struct Node* temp = stack;
if(temp == NULL)
return; // empty list, exit
// Going to last Node
while(temp->next != NULL)
temp = temp->next;
// Traversing backward using prev pointer
while(temp != NULL) {
cout << temp->sv << " ";
cout << temp->real << " ";
if (temp->log == true)
cout << "TRUE " << " ";
else
cout << "FALSE " << " ";
cout << temp->simb << " ";
//cout << temp->str << "\n";
temp = temp->prev;
}
printf("\n");
}
int main() {
/*Driver code to test the implementation*/
head = NULL; // empty list. set head as NULL.
// Calling an Insert and printing list both in forward as well as reverse direction.
Initialize(head);
InsertAtTail(head);
Print(head);
InsertAtTail(head);
Print(head);
fd.close();
}
输入数据是:
4 5.27 TRUE $ asdf
6 7.3 TRUE#qwer
9 8.8 FALSE @ zxvc
7 6.35否! vbmn
1 0.89 TRUE%ghjk
有人可以解释这里有什么问题吗?
答案 0 :(得分:4)
而不是使用C标准函数malloc
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
你必须使用operator new
在这种情况下,编译器将调用类std::string
的构造函数来创建数据成员str
1}}的其他对象str将不会被创建,程序将会混乱。
函数std::string
只是分配一个请求大小的原始内存。它对类的构造函数一无所知。
答案 1 :(得分:1)
malloc
分配原始内存块。这对于仅存储数据的简单(POD)数据类型就足够了。但是std::string
需要调用其构造函数才能正确初始化。因此,您必须使用new
分配节点:
Node* newNode = new Node();
通常,在C ++中很少需要malloc
(它不会调用任何构造函数)。它是一个C函数。
请注意,您需要拨打delete
而不是free
来释放由new
分配的内存。