当使用std::shared_ptr的函数返回堆分配的对象时,是否保证该对象是活动的
Is heap allocated object guaranteed to be alive when it is returned from a function with std::shared_ptr?
我正在学习C++。我刚刚了解到std::shared_ptr
可以用于管理堆分配的对象,就像引用计数一样。
目前,我的编译器(Xcode/Crang/C++11(显示了我想要的确切行为。打印此结果,
Step0
Step1
CREATED!
Step2
Step3
Step5
DESTROYED!
Step6
使用此代码。
class Obj1
{
public:
Obj1() { printf("CREATED!n"); }
~Obj1() { printf("DESTROYED!n"); }
};
std::shared_ptr<Obj1> func1 ()
{
printf("Step0n");
{
printf("Step1n");
std::shared_ptr<Obj1> o1(new Obj1());
printf("Step2n");
std::shared_ptr<Obj1> o2 = o1;
printf("Step3n");
return o2;
}
printf("Step4n");
}
int main(int argc, const char * argv[])
{
{
std::shared_ptr<Obj1> o3 = func1();
printf("Step5n");
}
printf("Step6n");
return 0;
}
但据我所知,当std::shared_ptr
被分配给新变量时,这可以通过C++的复制构造函数优化来实现。(我不确定名称…(如果是的话,Obj1
实例在从函数返回时可能不能保证是活动的,因为实际上shared_ptr
在调用方被破坏并在语义上重新创建。
当然,所有这些都是新手的假设。请让我知道在这种情况下,对对象生存期的实际预期是什么。
PS。这源于我之前的问题:清理堆分配对象的良好实践或惯例?
要么延长了o2
的生存期,要么在销毁之前制作了它的副本。无论哪种方式,至少有一个shared_ptr
始终存在,因此代码是安全的。
您误解了优化的工作原理。假设我们有一个小例子:
std::shared_ptr<Foo> func()
{
std::shared_ptr o2;
o2.reset( new Foo );
return o2;
}
std::shared_ptr<Foo> o1 = func();
编译器通过优化可以做的事情看起来是这样的(不完全是这样,但有助于理解这个想法(:
void func( std::shared_ptr<Foo> &o2 )
{
o2.reset( new Foo );
}
std::shared_ptr<Foo> o1;
func( o1 );
所以,从您的角度来看,几乎并没有任何变化,只删除了对象的副本(智能指针(。这不会影响福的一生。
相关文章:
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 在这种情况下,java对象是否可以调用本机函数
- 堆分配的对象是否存在永不为空的唯一所有者?
- QFileSystemModel 对象是否会被删除?
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 临时C++对象是否为左值?
- 为什么复制构造函数不需要检查输入对象是否指向自身?
- "this"指向的对象是否与 const 对象相同?
- 有什么方法可以检测我的类的对象是否在堆栈上创建
- 基类对象是否隐式添加到派生类中?
- 当 T 具有非平凡析构函数时,类类型 T 的对象是否可以常量初始化?
- 如何检查指针后面的对象是否有效或已删除?
- 谷神星求解器:残差函子使用的可变对象是否良好实践?还有什么其他选择
- 单一实例对象是否通过线程安全返回shared_ptr
- 对象是否保证在调用其成员函数之前被初始化
- 在另一个对象 B 中创建对象 A 时,对象 A 是否是对象 B 的本地对象,对象 A 是否会存在于对象 B 的实例化之外?
- 如何确定对象是否已分配成员
- 我们如何在c 中序列化或应对类的对象.是否有任何预定义的库
- 友元类对象是否可以在其成员函数中访问派生类对象的基类私有成员?