在函数调用中创建的对象的生命周期

时间:2018-04-12 16:29:55

标签: c++

对象生命周期通常与范围有关,但是当在函数内部创建对象时,事情变得有点模糊(至少对我而言)。检查以下代码:

#include <iostream>
#include <string>

using namespace std;

struct ins
{
    ins() : _num(++num) { cout << "ctor " << _num << endl; }
    ~ins() { cout << "dtor " << _num << endl; }
    int get() { return _num; }
    static int num;
    int _num;
};

int ins::num = 0;
ins geti() { return {}; }
void usei(int i) { cout << "using " << i << endl; }

int main()
{
    usei(geti().get());
    cout << endl;
    usei(geti().get());
}

输出

  

ctor 1

     

使用1

     

dtor 1

     

ctor 2

     

使用2

     

dtor 2

Demo

长话短说,我想知道在这种情况下是否有办法“计算”对象的生命周期。我怎么知道每个对象绑定的功能?我现在的心理模型对我的影响并不大。

1 个答案:

答案 0 :(得分:1)

在深入研究cppreference后,我在object lifetime找到了一个部分。显然我的心理模型是错误的。

在这种情况下,Lifetime不会绑定到函数,而是绑定到表达式。我的情况属于临时对象生存期,由

创建
  • 从函数返回prvalue

在这种情况下,适用以下规则:

  

所有临时对象都被销毁,作为评估的最后一步   表达式(词法上)包含它们所在的点   创建,如果创建了多个临时对象,它们就是   按照与创造顺序相反的顺序销毁。这是真的   即使该评估以抛出异常而告终。