首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指针boost::shared_ptr

指针boost::shared_ptr
EN

Stack Overflow用户
提问于 2014-03-03 13:38:47
回答 5查看 746关注 0票数 2

我只是偶然发现了boost::shared_ptr文档,它是这样的:

代码语言:javascript
复制
Sometimes it is necessary to obtain a shared_ptr given a raw pointer
to an object that is already managed by another shared_ptr instance.
Example:

void f(X * p) 
{
    shared_ptr<X> px(???);
}

Inside f, we'd like to create a shared_ptr to *p.

In the general case, this problem has no solution.

为什么?它不被允许做这样的事情:

代码语言:javascript
复制
shared_ptr<X> px(p);

我是不是遗漏了什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-03-03 13:43:43

如果您有一个管理指针的shared_ptr,然后创建另一个shared_ptr来管理同一个指针(而不是复制原始的shared_ptr),那么您将为相同的资源创建两个管理器。当两者中的一个达到0的引用计数时,它将删除该对象,而另一个shared_ptr将指向已删除的内存和后面的所有内容。

票数 3
EN

Stack Overflow用户

发布于 2014-03-03 13:42:26

您可以这样做,但它可能导致未定义的行为,因为无法告诉第二个共享指针引用计数(指向同一对象的共享指针的数量)增加。这样的事情就会发生:

代码语言:javascript
复制
void f()
{
    boost::shared_ptr<int> firstSmart(new int(23)); // firstSmart is the only 
                                                    // manager of the int
    int *raw = firstSmart.get();
    boost::shared_ptr<int> secondSmart(raw);        // secondSmart also manages
                                                    // the same int as firstSmart
                                                    // but secondSmart does not 
                                                    // know about firstSmart
                                                    // and vice versa
}

f退出时,secondSmart被销毁,销毁共享的int。然后,firstSmart被销毁,试图破坏已经销毁的int,从而导致未定义的行为。

票数 0
EN

Stack Overflow用户

发布于 2014-03-03 13:44:41

如果你这么做的话:

代码语言:javascript
复制
main() {
  Object *obj = new Object();
  func(obj)
}

void func( Object *obj ) {
  shared_ptr objPtr(obj); // take ownership.
  objPtr->fun();
  // Passed object "obj" is destroyed here.
}

在函数func的末尾,对象指针将被销毁,而使用指针则会破坏对象本身。这不是一种可取的行为。

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

https://stackoverflow.com/questions/22148276

复制
相关文章

相似问题

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