C++ 共享的ptr在我可以正确使用之前就被销毁了

C++ 共享的ptr在我可以正确使用之前就被销毁了,c++,shared-ptr,C++,Shared Ptr,我有下面的代码,它应该通过线程a将一个共享的\u ptr实例添加到一个入侵链接列表中。其他一些消费者线程稍后将通过从列表中删除它来使用它。但是,在某一点上,我的共享\u ptr似乎被销毁,并且在链表中对它的引用不再有效,从而导致断言 有人能告诉我我做错了什么吗?我怀疑这是因为我在本地范围内创建了我的原始共享\u ptr,但它却被销毁了。虽然列表中还应该有一个引用???(这不是生产代码) 编辑: 所用变量的定义: BaseHookQueueList* lst; typedef boost::int

我有下面的代码,它应该通过线程a将一个共享的\u ptr实例添加到一个入侵链接列表中。其他一些消费者线程稍后将通过从列表中删除它来使用它。但是,在某一点上,我的共享\u ptr似乎被销毁,并且在链表中对它的引用不再有效,从而导致断言

有人能告诉我我做错了什么吗?我怀疑这是因为我在本地范围内创建了我的原始共享\u ptr,但它却被销毁了。虽然列表中还应该有一个引用???(这不是生产代码)

编辑:

所用变量的定义:

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
        }
BaseHookQueueList*lst;
typedef boost::intrusive::list BaseHookQueueList;
类QueueList:public boost::intrusive::list\u base\u hook
//使我的BaseHookQueueList接受指向QueueList类型的共享\u ptr与列表\u base\u挂钩冲突//因为它似乎不喜欢共享\u ptr。。。
////////////////////////////////////////////////////////////////////////////////////
如果(dwWait==WAIT\u OBJECT\u 0)//WAIT成功
{
而(计数!=100)
{
//一些新的请求到了
boost::shared_ptr Qlist(new QueueList());//创建共享_ptr实例
内部温度=0;
如果(计数>5)
{
Qlist->SetName(names[temp]);//用一些废话填充QueueList对象的name属性。。。
temp++;
}
其他的
{
Qlist->SetName(名称[计数]);
}
workerfunc(lst,Qlist);//传递给worker func
计数++;
}
}//shared_ptr超出范围,我从列表中得到断言错误!!
}
}
void workerfunc(BaseHookQueueList*l,列表项)//列表是一个typedef共享的\u ptr列表
{
{
boost::mutex::作用域锁定workerUnlock(listlock);
l->向前推(*项);//添加到列表
}
//锁定范围
{
boost::mutex::作用域锁定workerfunconsolelock(consolelock);
printf(“将项目添加到列表…\n”);
}
ReleaseSemaphore(hConsumer,1,NULL);//将conumser信号量设置为使用队列中当前项目数发出信号
}

在辅助函数中,您存储的是指向的项,而不是共享指针,因此共享指针的引用计数不会增加。

我猜在这种情况下,项是错误的。 运算符返回对您的类型的引用。因此,您在列表中添加了一个const ref,而不是共享的ptr的副本

l->push_front(*item);  //Add to list 

取消引用可能是问题所在。您没有将
shread\u ptr
实例传递给
l
列表,而是传递给指针对象本身。如果不是这样,请发布更完整、更少混乱的测试用例。

如果BaseHookQueueList是您所说的入侵列表,那么您应该记住,入侵列表并不拥有对象的所有权。在这种情况下,共享指针拥有所有权,当它们被销毁时,对象也会被销毁


编辑:您可以使用像std::list或std::queue这样的容器来代替侵入式列表,它可以包含智能指针。

我猜
list
是一个typedef,但是指向什么?另外,什么是
lst
?类型定义共享\u ptr列表;在发布代码时,如果您管理缩进,使大多数(如果不是全部)代码和注释可以在不进行水平滚动的情况下看到,则会有所帮助。但是,当您将对象放入列表时,std::list会复制该对象,如果列表中有很多对象,这不会产生很多开销吗???如果列表中包含
共享\u ptr
,那么成本将是复制共享指针的成本,共享指针很小(复制几个指针并更新引用计数)@David:small,但会触发一些解引用+对共享资源的访问(计数器)。如果
make\u shared
创建了
shared\u ptr
,则该值会减小。