std::shared_ptr<std::string> test() {
return std::make_shared<std::string>("sdsd");
}
cout << *test() << endl;
上面的代码可以正常工作。请问有人能告诉我"sdsd"字符串存储在哪里?我原以为它会报错,因为rvalue是一个临时对象。rvalue被复制和存储在哪里?
使用weak_ptr
std::weak_ptr<std::string> test() {
return std::make_shared<std::string>("sdsd");
}
cout << *test().lock() << endl;
有趣的是,上述代码出现了错误。有什么区别?
weak_ptr
的语义不同:它不被视为引用。这就是weak_ptr
的全部意义所在。 - Passer Byshared_ptr
的销毁意味着对存储的字符串没有引用,因此它被释放。而在第一个版本中,仍然存在一个引用,即返回值。 - M.Mtest()
返回后,您会得到一个临时对象。通常情况下,它的生命周期(https://en.cppreference.com/w/cpp/language/lifetime)在计算表达式后结束。'*所有临时对象都将在包含它们创建点的(词法)完整表达式计算的最后一步中被销毁*'. 将test()
的结果分配给变量以使生命周期更清晰。在第二个示例中,shared_ptr
被传递给了一个weak_ptr
,当计算对象的活动使用次数时不计算,当离开test()
时,使用计数器变为0
。 - Sebastian