首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用shared_ptr替换新的/删除?

用shared_ptr替换新的/删除?
EN

Stack Overflow用户
提问于 2021-03-31 10:58:53
回答 2查看 1K关注 0票数 0

这里的最终想法是防止在用AFAIK不具有隐式生存期的delete创建对象时丢失new

原码

代码语言:javascript
复制
A* getA(...)
{
    return new A(...);
}

int func(...)
{
    auto x = getA(...);
    delete x;
    return 0;
}

我的尝试:

代码语言:javascript
复制
A* getA(...)
{
    return shared_ptr<A>(new A(...)).get();
}

int func(...)
{
    auto x = getA(...);
    return 0;
}

  • 这是个好方法吗?
  • shared_ptr什么时候才能结束它的生命?(假设func(.)是一个完整的线程)
  • 什么时候shared_ptr将结束它的生命?(假设func(.)在无限环线程中调用)
EN

回答 2

Stack Overflow用户

发布于 2021-03-31 11:10:31

有两个智能指针,shared_ptrunique_ptr。他们用不同的语义来模拟记忆的所有权。如果只有一个所有者,那么您应该使用unique_ptr,这是大多数情况下的情况。在这里,shared_ptr似乎不是正确的选择。

getA()可以返回一个原始指针。这样做的目的是用一个智能指针封装它,这样您就不必显式地管理它的生存期了。

代码语言:javascript
复制
A* getA()
{
    return new A();
}

void takeA(A*)
{
}

int func()
{
   std::unique_ptr<A> ptr = getA();

   takeA(ptr.get());
}

或者,您的getA()可以返回一个智能指针。

代码语言:javascript
复制
std::unique_ptr<A> getA()
{
    return std::make_unique<A>();
}

要回答最后一个问题:

当智能指针对象超出作用域时,

  • std::unique_ptr生存期结束。由于只有一个所有者,因此当智能指针对象超出作用域时,托管的原始对象是deleted.
  • std::shared_ptr生存期结束。由于有多个所有者,当最后一个所有者被销毁时,托管原始对象将被删除。为此目的,shared_ptr使用在堆上分配的控制块,所有共享同一对象点的实例都对此进行分配。此控制块有一个计数器,在创建指向同一对象的新共享指针时递增,在被销毁时递减。当此计数器达到0时,原始对象将被销毁。
票数 3
EN

Stack Overflow用户

发布于 2021-03-31 11:10:39

不,这不仅是一个不好的方法,它是错误的,是不明确的行为。

shared_ptr获取指针的所有权。shared_ptr的全部目的是使用而不是指针,当shared_ptr离开时,底层指针会自动删除。

代码语言:javascript
复制
 return shared_ptr<A>(new A(...)).get();

这里发生的事件顺序如下:

newed.是

  1. A的一个实例

构造

  1. shared_ptr并获取指向A.

的指针的所有权。

returned.中检索底层指针以获取

  1. shared_ptr被摧毁。这只是一个临时的对象。然后,它的析构函数将自动delete的底层指针.

  1. ,您将持有一个已删除对象的袋子,该对象已被返回。任何进一步使用它都是未定义的行为。

这应该是,简单地说:

代码语言:javascript
复制
shared_ptr<A> getA(...)
{
    return shared_ptr<A>(new A(...));
}

int func(...)
{
    auto x = getA(...);
    return 0;
}

对于所有的意图和目的,x是您func中的智能指针。x->something()调用它的something方法等等..。当func()返回时,它会被销毁,底层指针会自动地被保存(当然,除非它的一个副本被保存在某个地方,或者被传递给另一个函数,将其保存在某个隐蔽的洞中,等等)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66886492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档