C ++在指定对指针的引用时获取临时错误地址

时间:2012-02-13 15:48:33

标签: c++ pointers struct

该程序是用C ++编写的。我试图使用void函数来扩展一个Line结构,该结构由一个整数长度和一个指向下一个连接线的指针组成。有一个void Expand函数,用于为结构中的行指针赋予行引用。新线的尺寸是当前线的两倍。使用我正在使用的代码,我得到了一个g ++错误“接受临时[-fpermissive]的地址”。任何人都可以建议一种方法,函数将行引用的有效实例添加到行指针nextLine?

struct Line
{
    int length;
    Line* nextLine;
};

Line NewLine(Line& lineRef)
{
    Line newLine;
    newLine.length = lineRef.length * 2;
    return newLine;
}

void Expand(Line& lineRef)
{
    //Error here states: Taking address of temporary [-fpermissive]
    lineRef.nextLine = &NewLine(lineRef);
}

int main() {

    Line line;

    Expand(line);

    cout << line.length << endl;
    cout << line.nextLine->length << endl;

    return 0;
}

3 个答案:

答案 0 :(得分:3)

该行的问题:

lineRef.nextLine = &NewLine(lineRef);

是编译器告诉你的。你正在拿一个临时的地址。这意味着在达到;之后,临时NewLine(lineRef)将被销毁,指针lineRef.nextLine将成为指向死对象的指针。


更新:如何使其发挥作用。

这取决于你想做什么。如果您想要的是列表,那么最简单的事情就是使用预先打包的list数据结构(std::list<Line>),而不是滚动您自己的列表实现。

如果你真的想要实现自己的列表,那么你需要动态分配下一个节点(这将使编译器满意),你需要添加代码到 manage 列表(正确构造初始化字段的Line对象,包括 copy-construction ,析构函数来管理动态内存,可能是一些辅助函数来 walk 列表(或迭代器以便能够使用算法...)只是不要打扰并使用std::list

答案 1 :(得分:3)

您正在尝试实施链接列表,但您还不了解手动内存管理。

短期解决方案是使用std::list<Line>。已经有一个有效的解决方案,你不需要为幕后的东西烦恼。

长期解决方案也是使用std::list<Line>。即使您是经验丰富的开发人员并且知道如何操作,也无需重新发明轮子。

答案 2 :(得分:1)

这个有效

    struct Line
    {
            int length;
            Line* nextLine;
            ~Line(){delete nextLine;}
             //Make copy constructor and assignment operator private
    };

    void Expand(Line* lineRef)
    {
            lineRef->nextLine = new Line;
            lineRef->nextLine->length = 2*(lineRef->length) ;
    }

int main() 
{

        Line* line = new Line;
        line->length = 5;

        Expand(line);

        cout << line->length << endl;
        cout << line->nextLine->length << endl;

        delete line;
        return 0;
}