C++ 使用 new 在循环中创建唯一的对象指针
C++ using new to create unique object pointers within a loop
我正在尝试在双向链表中系统地实例化持有 Student 类型对象的节点。当我手动创建节点并将它们添加到列表中时,我的双向链表工作正常,但是当我在循环中实例化节点时,指针被覆盖。
为了这段代码,我需要根据文本文件的输入实例化一定数量的节点,所以我必须使用循环。
DoublyLinkedList<Student> dlist;
for(int j = 0; j<numOfStudents;j++)
{
getline(myfile,line);
Student student1 = Student(toInt(line)); //toInt() converts string to Int
Node<Student> node1 = Node<Student> (student1);
dlist.add(&node1);
}
我遇到的问题是,如果文本文件具有以下学生参数。
6
11
9
然后双向链表将简单地填充具有“9”作为参数的同一 Student 对象的 3 个实例。
研究这个问题,我发现使用new运算符会为每个对象提供一个唯一的指针,只要我之后删除它就可以防止内存泄漏。但是,在尝试通过在 Node 前面添加新的来实现它时,我收到了错误
没有可行的从 'Node *' 到
'Node'
我非常感谢任何对问题的见解或朝着正确方向的推动。
for(int j = 0; j<numOfStudents;j++)
{
getline(myfile,line);
Student student1 = Student(toInt(line)); //toInt() converts string to Int
Node<Student> node1 = Node<Student> (student1);
dlist.add(&node1);
}
我们这里有两个问题。
首先,student1 和 node1 只在你的循环中有作用域。这意味着当循环退出时,列表中的数据不再有效。 student1 中的数据可能在 node1 的构造中被复制,这使得 student1 仅在循环中作用域这一事实变得无关紧要,但 node1 绝对是一个问题。
其次,您将指向 node1 的指针添加到您的列表 numOfStudents 次。
一个解决方案涉及为您的 "Nodes"
分配内存
for(int j = 0; j<numOfStudents;j++)
{
getline(myfile,line);
Student student1 = Student(toInt(line)); //toInt() converts string to Int
// Create a new node to add to the list
Node<Student> *node1 = new Node<Student> (student1);
// Add the node to the list
dlist.add(node1);
}
这里要记住的重要一点是,当您从列表中删除元素时,必须在完成后释放它们。
delete <pointer to allocated node>
我正在尝试在双向链表中系统地实例化持有 Student 类型对象的节点。当我手动创建节点并将它们添加到列表中时,我的双向链表工作正常,但是当我在循环中实例化节点时,指针被覆盖。
为了这段代码,我需要根据文本文件的输入实例化一定数量的节点,所以我必须使用循环。
DoublyLinkedList<Student> dlist;
for(int j = 0; j<numOfStudents;j++)
{
getline(myfile,line);
Student student1 = Student(toInt(line)); //toInt() converts string to Int
Node<Student> node1 = Node<Student> (student1);
dlist.add(&node1);
}
我遇到的问题是,如果文本文件具有以下学生参数。
6
11
9
然后双向链表将简单地填充具有“9”作为参数的同一 Student 对象的 3 个实例。
研究这个问题,我发现使用new运算符会为每个对象提供一个唯一的指针,只要我之后删除它就可以防止内存泄漏。但是,在尝试通过在 Node 前面添加新的来实现它时,我收到了错误
没有可行的从 'Node *' 到 'Node'
我非常感谢任何对问题的见解或朝着正确方向的推动。
for(int j = 0; j<numOfStudents;j++)
{
getline(myfile,line);
Student student1 = Student(toInt(line)); //toInt() converts string to Int
Node<Student> node1 = Node<Student> (student1);
dlist.add(&node1);
}
我们这里有两个问题。
首先,student1 和 node1 只在你的循环中有作用域。这意味着当循环退出时,列表中的数据不再有效。 student1 中的数据可能在 node1 的构造中被复制,这使得 student1 仅在循环中作用域这一事实变得无关紧要,但 node1 绝对是一个问题。
其次,您将指向 node1 的指针添加到您的列表 numOfStudents 次。
一个解决方案涉及为您的 "Nodes"
分配内存for(int j = 0; j<numOfStudents;j++)
{
getline(myfile,line);
Student student1 = Student(toInt(line)); //toInt() converts string to Int
// Create a new node to add to the list
Node<Student> *node1 = new Node<Student> (student1);
// Add the node to the list
dlist.add(node1);
}
这里要记住的重要一点是,当您从列表中删除元素时,必须在完成后释放它们。
delete <pointer to allocated node>