При работе программа выдает 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, и только затем его можно затирать.
Может кто знает это баг или фича?