Глюк в STL (vector)
От: lis82  
Дата: 17.12.08 14:04
Оценка: -1
При работе программа выдает Access Violation.
Текст программы:
#include <vector>

class foo
{
private:
    char * String;
    void SetStr(char * str);
public:
    foo();
    foo(const foo & e);
    foo(char * str);
    ~foo();
};

int main(int argc, char* argv[])
{
    std::vector<foo> Err;
    Err.push_back(foo("first"));
    Err.push_back(foo("second"));
    Err.erase(Err.begin()); //Здесь почему-то удаляется элемент "second"
    Err.erase(Err.begin());//Ошибка возникает здесь 
    return 0;
}
foo::foo()
{
    String=NULL;
}
foo::foo(const foo &e)
{
    String=NULL;
    SetStr(e.String);
}
foo::foo(char *str)
{
    String=NULL;
    SetStr(str);
}
foo::~foo()
{
    if(String)
        delete String;
}
void foo::SetStr(char * str)
{
    if(String!=NULL)
    {
        delete String;
        String=NULL;
    }
    size_t Length=strlen(str)+1;
    if(Length>0)
    {
        String=new char[Length];
        strcpy(String,str);
    }
}

Компилировал и в Builder2006 и в Studio2005 — результат одинаковый.
Я думаю, что дело в библиотеке STL:
Вот что я нарыл:
<vector>
...
    iterator erase(iterator _Where)
        {    // erase element at where
        _STDEXT unchecked_copy(_VEC_ITER_BASE(_Where) + 1, _Mylast,
            _VEC_ITER_BASE(_Where));
        _Destroy(_Mylast - 1, _Mylast);
        --_Mylast;
        return (_Where);
        }
...

Т.е. сначала идет копирование элементов в новое место (затирая содержимое _Where), а затем удаляется последний в списке.
Но ведь по логике сначала нужно удалить содержимое _Where, и только затем его можно затирать.

Может кто знает это баг или фича?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.