gpt4 book ai didi

c++ - boost 共享指针 C++ : shared pointer unable to free resource on release

转载 作者:行者123 更新时间:2023-11-30 02:07:32 25 4
gpt4 key购买 nike

我遇到了无法摆脱最后一个共享指针的问题,实际上我有点需要它。

所以我有一个管理器和一些工作线程。管理器保留指向不同资源的共享指针的集合。 worker 可以向管理器请求指向资源的共享指针。总会有 1 个或多个 worker 共享指向资源的指针。我的最终目标是当所有工作人员都使用完该资源后,该资源将被删除。然而,在这个方案中,管理器总是维护一个指向资源的共享指针,所以即使没有工作人员卡在共享指针上,资源也不会被删除 b/c 引用计数应该至少为 1,因为经理卡在上面。我需要管理器卡在一个指向引用的共享指针上,这样如果任何工作人员来请求共享指针,管理器就能够提供一个。


编辑:当资源创建时,工作人员已经拥有它。所以在它创建时它的引用计数应该是两个(经理有它,一个 worker 有它)。当引用计数达到一个时(只有经理有),我希望将其删除。如果资源已经被删除,并且有工作人员来寻找它,则应重新创建资源。


edit2:一些代码:

SomeSharedPointer Manager::getResource(String unique_id) 
{ // if unique id exists, return its mapped shared pointer, if unique id doesn't exist, create the resource, assign it a shared pointer, and stick it in the map
}


class Worker
{
SomeSharedPointer my_sp;

Worker()
{
String someUniqueId = "http://blah.com"
my_sp = Manager::getResource(someUniqueId);
// do some work on the resource
}

~Worker()
{
my_sp.reset(); // done with resource
}
}

最佳答案

如果不需要保留控制权,只需传递它,为什么管理器要持有对象的 shared_ptr(强引用)?看不到您的代码,似乎让经理持有一个 weak_ptr 然后将其传递给工作人员,工作人员将其锁定到他们的 shared_ptr 中。这将允许经理在不拥有自己的推荐人的情况下传递推荐人。

class Worker
{
SomeSharedPointer my_sp;

Worker()
{
String someUniqueId = "http://blah.com"
weak_ptr wp = Manager::getResource(someUniqueId);
my_sp = wp.lock();

// do some work on the resource
}

~Worker()
{
//my_sp.reset(); // handled automatically, as part of how shared pointers work
}
}

如果工作人员完成并释放资源,资源将被销毁,管理器将无法再分发引用(可以在 getResource 中测试并重新加载)。这看起来不是很理想,但它是您设计的一部分,因此它应该能很好地工作。

编辑:您还可以让 getResource 返回一个共享指针,让管理器持有弱指针,尝试锁定,在内部进行检查/重新加载,然后返回共享指针。由于 weak_ptr 无法直接创建,因此可能会更好一些。

另一方面,您可以提供一个函数来补充为工作人员提供释放它并在管理器中进行计数检查的指针的函数。

关于c++ - boost 共享指针 C++ : shared pointer unable to free resource on release,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7765732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com