这里的最终想法是防止在用AFAIK不具有隐式生存期的delete创建对象时丢失new。
原码
A* getA(...)
{
return new A(...);
}
int func(...)
{
auto x = getA(...);
delete x;
return 0;
}我的尝试:
A* getA(...)
{
return shared_ptr<A>(new A(...)).get();
}
int func(...)
{
auto x = getA(...);
return 0;
}shared_ptr什么时候才能结束它的生命?(假设func(.)是一个完整的线程)shared_ptr将结束它的生命?(假设func(.)在无限环线程中调用)发布于 2021-03-31 11:10:31
有两个智能指针,shared_ptr和unique_ptr。他们用不同的语义来模拟记忆的所有权。如果只有一个所有者,那么您应该使用unique_ptr,这是大多数情况下的情况。在这里,shared_ptr似乎不是正确的选择。
getA()可以返回一个原始指针。这样做的目的是用一个智能指针封装它,这样您就不必显式地管理它的生存期了。
A* getA()
{
return new A();
}
void takeA(A*)
{
}
int func()
{
std::unique_ptr<A> ptr = getA();
takeA(ptr.get());
}或者,您的getA()可以返回一个智能指针。
std::unique_ptr<A> getA()
{
return std::make_unique<A>();
}要回答最后一个问题:
当智能指针对象超出作用域时,
std::unique_ptr生存期结束。由于只有一个所有者,因此当智能指针对象超出作用域时,托管的原始对象是deleted.std::shared_ptr生存期结束。由于有多个所有者,当最后一个所有者被销毁时,托管原始对象将被删除。为此目的,shared_ptr使用在堆上分配的控制块,所有共享同一对象点的实例都对此进行分配。此控制块有一个计数器,在创建指向同一对象的新共享指针时递增,在被销毁时递减。当此计数器达到0时,原始对象将被销毁。发布于 2021-03-31 11:10:39
不,这不仅是一个不好的方法,它是错误的,是不明确的行为。
shared_ptr获取指针的所有权。shared_ptr的全部目的是使用而不是指针,当shared_ptr离开时,底层指针会自动删除。
return shared_ptr<A>(new A(...)).get();这里发生的事件顺序如下:
newed.是
A的一个实例构造
shared_ptr并获取指向A.的指针的所有权。
从returned.中检索底层指针以获取
,
shared_ptr被摧毁。这只是一个临时的对象。然后,它的析构函数将自动delete的底层指针.这应该是,简单地说:
shared_ptr<A> getA(...)
{
return shared_ptr<A>(new A(...));
}
int func(...)
{
auto x = getA(...);
return 0;
}对于所有的意图和目的,x是您func中的智能指针。x->something()调用它的something方法等等..。当func()返回时,它会被销毁,底层指针会自动地被保存(当然,除非它的一个副本被保存在某个地方,或者被传递给另一个函数,将其保存在某个隐蔽的洞中,等等)。
https://stackoverflow.com/questions/66886492
复制相似问题