我只是偶然发现了boost::shared_ptr文档,它是这样的:
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.为什么?它不被允许做这样的事情:
shared_ptr<X> px(p);我是不是遗漏了什么?
发布于 2014-03-03 13:43:43
如果您有一个管理指针的shared_ptr,然后创建另一个shared_ptr来管理同一个指针(而不是复制原始的shared_ptr),那么您将为相同的资源创建两个管理器。当两者中的一个达到0的引用计数时,它将删除该对象,而另一个shared_ptr将指向已删除的内存和后面的所有内容。
发布于 2014-03-03 13:42:26
您可以这样做,但它可能导致未定义的行为,因为无法告诉第二个共享指针引用计数(指向同一对象的共享指针的数量)增加。这样的事情就会发生:
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,从而导致未定义的行为。
发布于 2014-03-03 13:44:41
如果你这么做的话:
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的末尾,对象指针将被销毁,而使用指针则会破坏对象本身。这不是一种可取的行为。
https://stackoverflow.com/questions/22148276
复制相似问题