shared_ptr在我正确使用之前就被销毁了

时间:2010-10-07 12:36:51

标签: c++ shared-ptr

我有以下代码,它应该通过线程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
        }

4 个答案:

答案 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的副本。