【问题标题】:Lifetime of C++ class membersC++ 类成员的生命周期
【发布时间】:2012-10-06 22:05:17
【问题描述】:

C++ 类成员的生命周期是多少。比如Foo对象的std::fstream什么时候会被释放?进入析构函数时还是离开析构函数时?这是在 C++ 标准中定义的吗?

struct Foo
{
    std::fstream mystream;
    ~Foo()
    {
        // wait for thread writing to mystream
    }
};

【问题讨论】:

    标签: c++ raii


    【解决方案1】:

    mystream 数据成员在Foo 对象的销毁过程中被销毁,~Foo() 的主体被执行。 C++11 §12.4[class.dtor]/8 状态:

    在执行析构函数的主体并销毁主体内分配的所有自动对象后,类X 的析构函数调用X 的直接非变体非静态数据成员的析构函数,@ 的析构函数987654326@ 的直接基类,如果X 是最派生类的类型,则其析构函数调用X 的虚拟基类的析构函数。

    mystreamFoo 的非变体、非静态数据成员(变体 数据成员是联合的成员;Foo 不是联合)。

    【讨论】:

      【解决方案2】:

      这是构造的逆向:

      构造:基类、数据成员(mystream在这里构造)、构造函数体

      析构:析构函数体、数据成员(mystream在这里被销毁)、基类

      【讨论】:

      • 如果类成员是指向一个本地成员的指针怎么办? string *name,那么name就是在一个方法中声明的指针,超出方法名会被销毁,那么类的*name呢?
      • @TomSawyer:不管它指向什么。指针本身仍然是一个数据成员。
      • 我知道,但是它会变成悬空指针,因为它指向的内存地址在超出范围后已经被释放了。
      猜你喜欢
      • 2020-01-12
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-09
      • 1970-01-01
      • 2016-05-20
      相关资源
      最近更新 更多