发布由指针管理的列表的添加和打印元素
Issue adding and printing elements of a List managed by pointers
我遇到了一个问题,我遇到了内存冲突错误(我正在处理内存)和错误的输入。我正在做的是一个指针管理列表。
我的代码应该这样做:用多个条目更新引用的指针并打印它们。它部分地做到了,让我告诉你。
代码:
#include "stdafx.h"
#include <string>
#include <iostream>
#include <tuple>
#include <vector>
using namespace std;
struct Lyric
{
Lyric* next;
tuple<int, string> tuple;
};
void Addition(Lyric*& poetry, tuple<int, string> tpl)
{
Lyric* newl = new Lyric;
newl->tuple = tpl;
newl->next = poetry;
poetry = newl;
}
void PrintScr(Lyric*& poetry)
{
if (poetry == NULL)
{
cout << "Empty list !" << endl;
return;
}
else
{
Lyric* prel = poetry;
while (prel != NULL)
{
cout << "Printing the integer: " << get<0>(prel->tuple) << endl;
cout << "Printing the string : " << get<1>(prel->tuple) << endl;
cout << "------------------------------------------" << endl;
prel = prel->next;
}
}
}
void main()
{
string a_str[] = {"test1", "test2"};
Lyric* poetry = new Lyric();
/*
int size = 1;
for (int i = 0; i <= size; i++)
Addition(poetry, i, make_tuple(i, a_str[i]));
*/
Addition(poetry, make_tuple(0, a_str[0]));
Addition(poetry, make_tuple(1, a_str[1]));
PrintScr(poetry);
system("PAUSE");
}
输出:
所以应该按照添加的顺序打印它们。我最好的选择是我在 PrintScr 方法中搞砸了一些事情,因为它以相反的方式打印它们并且还打印了一个 non-existing 项目,但我不确定我做错了什么,我正在检查元素一一个并打印它们....
它应该是这样的:
Printing the integer : 1
Printing the string : test1
-------------------------------
Printing the integer : 2
Printing the string : test2
-------------------------------
您永远不会将 Lyric 中的下一个 ptr 初始化为 NULL,因此当您到达列表中的最后一项时,它是一些垃圾指针,当您尝试访问它指向的内存时会导致崩溃。
您可以通过在 Lyric 的构造函数中将 next 设置为 NULL 或在创建它后立即在 main.cpp 中设置 poetry->next = NULL 来解决此问题。
我还应该指出,您在 Addition() 中插入列表的前面而不是列表的后面,这可能不是您想要的。
这一行是罪魁祸首:
Lyric* poetry = new Lyric();
Lyric
的默认构造函数没有为 next_
成员设置合理的值。它保持未初始化状态,当您取消引用它时会出现未定义的行为。
您需要的是:
Lyric* poetry = nullptr;
我遇到了一个问题,我遇到了内存冲突错误(我正在处理内存)和错误的输入。我正在做的是一个指针管理列表。
我的代码应该这样做:用多个条目更新引用的指针并打印它们。它部分地做到了,让我告诉你。
代码:
#include "stdafx.h"
#include <string>
#include <iostream>
#include <tuple>
#include <vector>
using namespace std;
struct Lyric
{
Lyric* next;
tuple<int, string> tuple;
};
void Addition(Lyric*& poetry, tuple<int, string> tpl)
{
Lyric* newl = new Lyric;
newl->tuple = tpl;
newl->next = poetry;
poetry = newl;
}
void PrintScr(Lyric*& poetry)
{
if (poetry == NULL)
{
cout << "Empty list !" << endl;
return;
}
else
{
Lyric* prel = poetry;
while (prel != NULL)
{
cout << "Printing the integer: " << get<0>(prel->tuple) << endl;
cout << "Printing the string : " << get<1>(prel->tuple) << endl;
cout << "------------------------------------------" << endl;
prel = prel->next;
}
}
}
void main()
{
string a_str[] = {"test1", "test2"};
Lyric* poetry = new Lyric();
/*
int size = 1;
for (int i = 0; i <= size; i++)
Addition(poetry, i, make_tuple(i, a_str[i]));
*/
Addition(poetry, make_tuple(0, a_str[0]));
Addition(poetry, make_tuple(1, a_str[1]));
PrintScr(poetry);
system("PAUSE");
}
输出:
所以应该按照添加的顺序打印它们。我最好的选择是我在 PrintScr 方法中搞砸了一些事情,因为它以相反的方式打印它们并且还打印了一个 non-existing 项目,但我不确定我做错了什么,我正在检查元素一一个并打印它们....
它应该是这样的:
Printing the integer : 1
Printing the string : test1
-------------------------------
Printing the integer : 2
Printing the string : test2
-------------------------------
您永远不会将 Lyric 中的下一个 ptr 初始化为 NULL,因此当您到达列表中的最后一项时,它是一些垃圾指针,当您尝试访问它指向的内存时会导致崩溃。
您可以通过在 Lyric 的构造函数中将 next 设置为 NULL 或在创建它后立即在 main.cpp 中设置 poetry->next = NULL 来解决此问题。
我还应该指出,您在 Addition() 中插入列表的前面而不是列表的后面,这可能不是您想要的。
这一行是罪魁祸首:
Lyric* poetry = new Lyric();
Lyric
的默认构造函数没有为 next_
成员设置合理的值。它保持未初始化状态,当您取消引用它时会出现未定义的行为。
您需要的是:
Lyric* poetry = nullptr;