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

标签 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;}
};

我用 Node 对象初始化了 first_node_ptr,但是传入 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*)& 而不是 Node*& 时,我会收到关于不完整类型的编译错误?

附言 智能指针的使用能否改变这种情况?

P.P.P.S. @JesperJuhl 询问用例。 这个想法是创建循环链表,其中每个节点都有一个指向第一个哨兵节点的 Head 指针的引用。我从 Herb Sutter 在 CppCon 视频 2016 43:00 中得到这个想法。在视频中他谈到了独特的指针,但我给出了原始指针的例子,它可能会变得有点困惑。

最佳答案

Node::list_first_node_ptr 是一个引用。它不关心被引用对象的,只关心被引用对象本身是否实际存在。因为 List::first_node_ptr 在构造 Node::list_first_node_ptr 时保证存在,所以这是合法的代码。

换一种说法;引用永远不能为 null,但它可以引用为 null 的指针。

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

关于c++ - 指向未初始化数据成员的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50973993/

相关文章:

c++ - 尝试删除列表中的指针会导致内存使用量不断增长

C++ 指针加法被乘

android - JNI OpenCV Android 画线或矩形功能

c++ - 哪些 C/C++ 编译器可用于 VxWorks?

c++ - 在循环初始化中使用 constexpr 和 static?

c++ - 如何自动将强类型枚举转换为 int?

c++ - 如何从 decltype 引用中获取值类型?

c++ - 带有 size_t 的奇怪循环

c++ - 如何将 Erlang 连接到 C++?

检查数组的单词是否存在于C中的txt文件中