Dangling pointer в std::vector.push_back() - это нормально?
От: biffant  
Дата: 09.06.08 09:55
Оценка:
VS6 SP6, BoundsChecker ругается, мол, dangling pointer в следующем случае:

inline bool MyInterface::MyFunction(
                vector <pair<long, vector<long> > >      &  MyVector
            )
{
<...>
if(SomeCondition)
      {
      pair<long, vector<long> > MyPair;
      long MyVar1, MyVar2;

      <...>

      MyPair.first = MyVar1;
      MyPair.second.push_back(vector<long>::value_type(MyVar2));

      MyVector.push_back(vector<pair<long, vector<long> > >::value_type(MyPair));
      }
<...>
}


Во время исполнения второго push_back, в <vector> возникает "висячий указатель".

Далее везде, для удобства чтения, используем
typedef struct std::pair<long,class std::vector<long,class std::allocator<long> > > MyStruct;


Current Call stack:

vector<MyStruct,class std::allocator<MyStruct> >::size
vector<MyStruct,class std::allocator<MyStruct> >::insert
vector<MyStruct,class std::allocator<MyStruct> >::insert
vector<MyStruct,class std::allocator<MyStruct> >::push_back
MyFunction


Allocation Call stack:

_Allocate    <xmemory>
allocator<MyStruct>::allocate    <xmemory>
vector<MyStruct,class std::allocator<MyStruct> >::insert    <vector>
vector<MyStruct,class std::allocator<MyStruct> >::insert    <vector>
vector<MyStruct,class std::allocator<MyStruct> >::push_back    <vector>


Deallocation Call stack:
allocator<MyStruct>::deallocate    <xmemory>
vector<MyStruct,class std::allocator<MyStruct> >::insert    <vector>
vector<MyStruct,class std::allocator<MyStruct> >::insert    <vector>
vector<MyStruct,class std::allocator<MyStruct> >::push_back    <vector>
MyFunction


Что происходит в <vector>:
void push_back(const _Ty& _X)
        {insert(end(), _X); }

Далее
iterator insert(iterator _P, const _Ty& _X = _Ty())
        {size_type _O = _P - begin();
        insert(_P, 1, _X);
        return (begin() + _O); }

Далее в insert()
void insert(iterator _P, size_type _M, const _Ty& _X)
        {if (_End - _Last < _M)
            {size_type _N = size() + (_M < size() ? size() : _M);
            iterator _S = allocator.allocate(_N, (void *)0);
            iterator _Q = _Ucopy(_First, _P, _S);
            _Ufill(_Q, _M, _X);
            _Ucopy(_P, _Last, _Q + _M);
            _Destroy(_First, _Last);
            allocator.deallocate(_First, _End - _First);
            _End = _S + _N;
            _Last = _S + size() + _M;
            _First = _S; }
                 <...>
                 }

Здесь он заходит в size() предпоследней строчки:
size_type size() const
        {return (_First == 0 ? 0 : _Last - _First); }

В результате, видим "Dangling Pointer: Pointer 0x054BE528, allocated by global_operator_new, has already been freed."

ВОПРОС — это просто особенность STL, либо я могу как-то исправить ситуацию при вызове std::vector.push_back()?

Буду признателен за любую помощь!
stl vector boundschecker
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.