【问题标题】:Using pointer to non-initialized member in initializer list在初始化列表中使用指向未初始化成员的指针
【发布时间】:2013-11-08 16:34:34
【问题描述】:

我不知道我是否设法描述了我在标题中的意思,但说我们有一个像这样的数据类:

class Data
{
public:
    Data(int i) : m_data(i) {} // Must always be initialized with a value
    int m_data;
};

还有一个像这样的 Main 类:

class Main
{
public:
    Main() :
        m_data(Set(&m_data)) // Is it ok to use the pointer of m_data like this?
    {
    }

private:
    int Set(Data* pData)
    {
        m_pData = pData;
        return 10;
    }

    Data* m_pData;
    Data m_data; //Must be initialized in the initializer list of the constructor
};

我的问题是:
在实际初始化 m_data 之前,我可以安全地将 &m_data 作为指向 Set 函数的指针吗? (假设 Set 函数中不使用指针,仅存储)
IE; &m_data 指针在 m_data 本身初始化之前是否有效?

【问题讨论】:

  • 为什么不在需要的时候使用 &m_data?
  • @MadScienceDreams 显然这是不必要的复杂而不是“生产”代码。我只是想知道它是否合法:)

标签: c++ pointers initializer-list


【解决方案1】:

在实际初始化m_data 之前,我可以安全地将&m_data 作为指向Set 函数的指针吗?

当然,您可以这样做:在内存至少被写入一次之前从指针读取是非法的,但指针本身可以安全存储。

【讨论】:

  • +1 表示“存储指向未初始化内存的指针是合法的”,-1 表示“哦,您可以使用operator= 写入未初始化的类型,没问题!”。不,在指向尚未构造的任意类的取消引用指针上调用 operator= 是不安全的。哎呀,即使Dataint,当我怀疑在构造函数中初始化它时,编译器也可以用0xBAADF00D 覆盖它,从而使您的=0 无法按预期运行。或者,它可以在调用构造函数之前0xBAADF00D你的内存,而Assert在初始化时它仍然是0xBAADF00D...
  • @Yakk 哎呀,我误读了这个问题,我以为是m_data 类型的int(这就是我写`= 0`的原因)。谢谢指正!
  • 优秀,简短而甜蜜!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多