C++无法让Pointers工作

Yec*_*kiy 0 c++ pointers

我在使用C++中的指针时遇到问题,我无法弄清楚它是什么;

我有一个名为LectureNode的类:

class LectureNode
{
public:
Lecture *LecturePtr;

LectureNode(Lecture lec)
{
    LecturePtr = &lec;
}
};
Run Code Online (Sandbox Code Playgroud)

这个类的构造函数工作得很好.我有另一个班:

class LectureForest
{
LectureNode *LecNode;
list<Lecture>::iterator it;

public:
LectureForest(list<Lecture> lecs)
{
    Makeset(lecs);
}

void Makeset(list<Lecture> lecs)
{
    for(it = lecs.begin(); it != lecs.end(); it++)
    {
        LecNode = LectureNode(*it); 
    }
}
Run Code Online (Sandbox Code Playgroud)

问题发生在最后一行.(*it)传递给LectureNode构造函数,LectureNode成功创建,但是LecNode没有指向它,而是调试器说坏指针.

谢谢.

Che*_*Alf 8

一个问题,代码

LectureNode(Lecture lec)
{
    LecturePtr = &lec;
}
Run Code Online (Sandbox Code Playgroud)

存储指向按值参数的指针,本地.如果稍后使用该指针,那么您有未定义的行为,因为by-value参数不再存在.


一个合理的解决方案就是做

LectureNode(Lecture* const lec)
    : lecturePtr_( lec )
{}
Run Code Online (Sandbox Code Playgroud)

哪里

  • 传递一个指针,当指针要存储时这是常规的(并且还解决了UB问题)

  • 在构造函数体中使用初始化列表而不是赋值,这是一个好习惯(它更通用,在更多情况下工作,也可以更高效)

  • 使用统一的命名规范(用于小写初始字符leclecturePtr_),具有共同的后缀约定数据成员(在端下划线).


只是传递中的一个注释,术语"初始化列表"具有多个含义.它还引用了一个花括号的初始值列表.构造函数初始化程序列表的神圣标准术语是mem-initializer,但我从未听过或看到有人使用该术语.