Boost :: Scoped_Ptr ломает код - PullRequest
       5

Boost :: Scoped_Ptr ломает код

1 голос
/ 11 октября 2010

Проверьте следующий код:

Это работает:

T *p = (std::find( this->first(), this->last(), *pPos ));
if( p != last() )
{
    this->push_back(data);

    T *right = (this->last() - 1);
    T *left  = (this->last() - 2);

    while( *pPos != data )
        std::iter_swap( left--, right-- ); 

    return const_cast<T*>(pPos);
}

Это не так:

boost::scoped_ptr<T> p(std::find( this->first(), this->last(), *pPos ));
if( p.get() != last() )
{
    this->push_back(data);

    T *right = (this->last() - 1); 
    T *left  = (this->last() - 2); 

    while( *pPos != data ) 
        std::iter_swap( left--, right-- ); 

    return const_cast<T*>(pPos);
}

Вторая версия выдает ошибку времени выполнения

Expression: _BLOCK_TYPE_IS_VALID_(pHead->nBlockUse)

означает, что мой scoped_ptr слишком рано вышел из области видимости или делает какие-то прикольные вещи, которые делают его недействительным.

Что я делаю не так с scoped_ptr?

Приложение:

Я не могу удалить ни один из указателей.Это нормально?Даже если я удаляю вправо / влево, я получаю ту же ошибку, даже если на нее больше не ссылаются.

Ответы [ 3 ]

7 голосов
/ 11 октября 2010

boost :: scoped_ptr удалит указатель, когда он (т.е. экземпляр boost :: scoped_ptr) выйдет из области видимости. Я не думаю, что вы хотите удалить указатель, который выглядит как итератор в вашем классе.

5 голосов
/ 11 октября 2010

scoped_ptr для использования с локально выделенной кучей памяти.Он уничтожает содержащийся объект и освобождает его при выходе из области действия.

Попытка освободить память в середине блока, например, которая будет возвращена find, недопустима.Уничтожение объекта без его владения приведет к двойному уничтожению, что также незаконно.

Просто не используйте scoped_ptr здесь.

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

Предполагая, что this-> first () \ last () возвращает обычный указатель, деструктор любого p, на который указывает p, будет вызван после завершения функции.

если std :: find возвращает this-> last (), будет вызван деструктор неинициализированной переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...