shared_ptr уничтожается, прежде чем я могу использовать его должным образом - PullRequest
0 голосов
/ 07 октября 2010

У меня есть следующий код, который должен добавить экземпляр shared_ptr в навязчивый связанный список по потоку А. Некоторый другой потребительский поток будет позже использовать его, удалив его из списка. Однако в определенный момент мой shared_ptr кажется уничтоженным, и ссылка на него в связанном списке больше не действительна, что приводит к Assert.

Может кто-нибудь просветить меня, что я делаю не так? Я подозреваю, что это потому, что я создаю свой оригинальный shared_ptr в локальной области видимости, и он просто уничтожается. Хотя в Списке еще должна быть ссылка на него ??? (Это НЕ производственный код)

EDIT:

Определения используемых переменных:

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 ]

4 голосов
/ 07 октября 2010
l->push_front(*item);  //Add to list 

Разыменование может быть проблемой.Вы передаете не экземпляр shred_ptr в список l, а сам объект.Если это не так, пожалуйста, опубликуйте более полный и менее запутанный контрольный пример.

3 голосов
/ 07 октября 2010

Если BaseHookQueueList является навязчивым списком, как вы сказали, то вы должны помнить, что навязчивый список не берет на себя владение объектами.В этом случае ваши общие указатели имеют право собственности, и когда они уничтожаются, объект также уничтожается.

edit: вместо навязчивого списка вы можете использовать контейнер типа std :: list или std :: queue, который может содержать умные указатели.

2 голосов
/ 07 октября 2010

В вашей рабочей функции вы храните указываемый элемент, а не общий указатель, поэтому счетчик ссылок общего указателя не увеличивается.

0 голосов
/ 07 октября 2010

Полагаю, элемент в этом случае неправильный.Как оператор возвращает ссылку на ваш тип.Таким образом, вы добавляете const ref в свой список, но не копию shared_ptr.

...