临时shared_ptr对象的生命周期

时间:2018-02-17 13:39:30

标签: c++

一方面,一般来说,临时对象在它所属的完整表达式的末尾被销毁。

引用标准N4140第12.2节的草案:

  

临时对象被作为评估全表达式的最后一步而被销毁,该表达式(词法上)包含创建它们的点。

另一方面,考虑案例1

#include <iostream>
#include <memory>

using std::cout;
using std::endl;
using std::shared_ptr;

void process(shared_ptr<int> p)
{
    std::cout << p.use_count() << std::endl;
}

int main()
{
    process(shared_ptr<int>(new int));
    return 0;
}

甚至更简单,如案例2

using std::cout;
using std::endl;
using std::shared_ptr;

int main()
{
    cout << shared_ptr<int>(shared_ptr<int>(new int)).use_count() << endl;
    return 0;
}

在任何一种情况下,输出为1.不是2.

我对输出感到有些困惑,并感谢任何可能提供一些解释的人。

我对案例1的理解是shared_ptr<int>(new int)是作为参数传递给process的临时对象。根据标准,在process返回之前不应该销毁它。如果是这种情况,那么从临时值初始化的参数p在输出时应该具有2的use_count,因为那时有{2}管理的对象{1}}。

我对案例2的理解遵循相同的逻辑。

似乎我的理解中肯定会有一些错误。有人可以指出他们吗?非常感谢。

注意:有几个已解决的问题与我有关,但阅读后我仍然感到困惑。您可以阅读this one作为参考。

1 个答案:

答案 0 :(得分:3)

表达式shared_ptr<int>(shared_ptr<int>(new int))只创建一个临时表达式,相当于shared_ptr<int>(new int)

您可以使用此代码查看您的期望:

shared_ptr<int> f(shared_ptr<int>&& x){return x;}
int main()
{
    //N1:
    cout << shared_ptr<int>(f(shared_ptr<int>(new int))).use_count() << endl;
    return 0;
}

关注user1095108提案:

shared_ptr<int> f(shared_ptr<int>&& x){return x;}
int main()
{
    //also prints 2, because equivalent to N1
    cout << f(shared_ptr<int>(new int)).use_count() << endl;

    //prints 3:
    cout << shared_ptr<int>(f(f(shared_ptr<int>(new int)))).use_count() << endl;

    //also prints 3:
    cout << f(f(shared_ptr<int>(new int))).use_count() << endl;
    return 0;
}