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