我有以下代码,它应该通过线程A将一个shared_ptr实例添加到一个侵入式链表中。其他一些消费者线程稍后会通过从列表中删除它来使用它。但是在某个时刻,我的shared_ptr似乎被破坏了,并且在链表中对它的引用不再有效,从而产生了断言。
有人可以告诉我我做错了什么吗?我怀疑是因为我在本地范围内创建了我原来的shared_ptr,它只是被破坏了。虽然List仍然应该引用它? (这不是生产代码)
编辑:
使用的变量的定义:
BaseHookQueueList* lst;
typedef boost::intrusive::list<QueueList> BaseHookQueueList;
class QueueList : public boost::intrusive::list_base_hook<>
// Making my BaseHookQueueList take a shared_ptr of pointing to type QueueList conflicts // with the list_base_hook because it does not seem to like shared_ptr...
////////////////////////////////////////////////////////////////////////////////////
if (dwWait == WAIT_OBJECT_0) //Wait is successfull
{
while(count != 100)
{
//Some new request arrived
boost::shared_ptr<QueueList> Qlist (new QueueList()); //Create shared_ptr instance
int temp = 0;
if (count > 5)
{
Qlist->SetName(names[temp]); // Fill up name property of QueueList object with some nonsense...
temp++;
}
else
{
Qlist->SetName(names[count]);
}
workerfunc(lst, Qlist); // Pass to worker func
count++;
}
} // shared_ptr goes out scope and I get ASSERT error from list!!
}
}
void workerfunc(BaseHookQueueList* l, LIST item) // LIST is a typedef shared_ptr<QueueList> LIST
{
{
boost::mutex::scoped_lock workerfunclock(listlock);
l->push_front(*item); //Add to list
}
//Scope of lock
{
boost::mutex::scoped_lock workerfuncconsoleLock(consolelock);
printf("Adding item to list...\n");
}
ReleaseSemaphore(hConsumer, 1, NULL); // Set conumser Semaphore to Signalled with number of items currently on the queue
}
答案 0 :(得分:4)
l->push_front(*item); //Add to list
取消引用可能是问题所在。您没有将shred_ptr
实例传递给l
列表,而是传递给指针者本身。如果不是这样,请发布更完整,更少混淆的测试用例。
答案 1 :(得分:3)
如果BaseHookQueueList是您所说的侵入式列表,那么您应该记住,侵入式列表不会占用对象的所有权。在这种情况下,您的共享指针具有所有权,当它们被销毁时,该对象也会被销毁。
编辑:您可以使用像std :: list或std :: queue这样的容器,而不是侵入式列表,它可以包含智能指针。
答案 2 :(得分:2)
在您的worker函数中,您存储指向的项而不是共享指针,因此共享指针的引用计数不会增加。
答案 3 :(得分:0)
我认为项在这种情况下是错误的。 操作员返回对您的类型的引用。因此,您将const ref放入列表中,但不是shared_ptr的副本。