指向未初始化数据成员的指针

时间:2018-06-21 17:02:51

标签: c++ c++11 pointers reference

在未初始化的数据成员上存储引用/指针是否安全?

不使用,但要存储一段时间。

我知道我必须使用智能指针。但是为了简化代码,我决定举一个拥有原始指针的示例。在实践中这不是很好,但是我认为足够好。

这是代码示例:

struct Node {
    Node(Node*& node_ptr) : list_first_node_ptr{node_ptr} {}
    /* ... */
    Node*& list_first_node_ptr;
};

struct List {
    // Is this line - dangerous?
    List() : first_node_ptr{new Node{first_node_ptr}} {}
    /* ... */
    Node* first_node_ptr;

    ~List() {delete first_node_ptr;}
};

我使用first_node_ptr对象初始化Node,但是传入Node对象的构造函数仍未初始化first_node_ptr


还有一个问题:我通过first_node_ptr时是否已经为Node分配了内存,那么class Base { public: // var_ptr points to uninitialized va Base() : var_ptr{&var}, var{10} {} int* var_ptr; int var; }; 构造函数中的引用地址是否有效?

我认为这个例子是相同的但简化的版本。我是对的吗?

(Node*)&

PS 为什么当我写Node*&而不是while True: color = input("Enter 4 characters of colors: ") for letter in color: # This iterate over each letter of the input if letter in dictColor: # If the letter is on your color's dictionay colorScore = colorScore + dictColor[letter] print("The color score is",colorScore) 时,我得到有关不完整类型的编译错误?

P.P.S。 使用智能指针可以改变情况吗?

P.P.P.S。 @JesperJuhl询问了用例。 这个想法是创建一个循环链表,其中每个节点在Head指针上都有指向第一个前哨节点的引用。我从CppCon视频2016 43:00中的 Herb Sutter中得到了这个想法。在视频中,他谈到了唯一的指针,但我举了一些原始指针的示例,这可能会变得有些混乱。

1 个答案:

答案 0 :(得分:1)

Node::list_first_node_ptr是参考。它并不关心被引用对象的 value ,只是被引用对象本身实际上存在。由于在构建List::first_node_ptr时保证存在Node::list_first_node_ptr,所以这是合法代码。

用另一种方式表达;引用永远不能为空,但是它可以引用为空的指针。

但是,值得注意的是,List::first_node_ptrNode完成构造之前不会指向有效的对象。这意味着在List::first_node_ptr构造函数完成之前,您不能取消引用Node::list_first_node_ptrNode