发出添加和打印由指针管理的List的元素

时间:2015-01-08 21:40:13

标签: c++ pointers c++11

我在这里遇到了一个问题,我遇到了内存违规错误(我正在处理内存)以及错误的输入。我正在做的是指针管理列表。

我的代码应该这样做:用多个条目更新引用的指针并打印它们。它部分完成,让我告诉你。

代码:

#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");
}

输出:

Error

所以它应该按照它们被添加的顺序打印出来。我最好的选择是我在PrintScr方法中搞砸了一些东西,因为它反向打印它们并且还打印了一个不存在的项目,但我不确定我做错了什么,我正在通过元素之一一个人打印出来......

这应该是这样的:

Printing the integer : 1
Printing the string  : test1
-------------------------------
Printing the integer : 2
Printing the string  : test2
-------------------------------

2 个答案:

答案 0 :(得分:2)

你永远不会将Lyric中的下一个ptr初始化为NULL,所以当你到达列表中的最后一项时,它会有一些垃圾指针,当你试图访问内存时它会导致崩溃指着。

您可以通过在Lyric的构造函数中设置NULL旁边或者在创建它之后立即在main.cpp中设置poetry-&gt; next = NULL来解决此问题。

我还应该指出我们在列表的前面而不是在Addition()中的列表后面插入,这可能不是你想要的。

答案 1 :(得分:2)

这条线是罪魁祸首:

Lyric* poetry = new Lyric();

Lyric的默认构造函数未向next_成员设置合理的值。它仍然未初始化,并且当您取消引用它时会得到未定义的行为。

您需要的是:

Lyric* poetry = nullptr;