Доброго времени суток,
столкнулся с интересной проблемой при использовании std::vector. Суть проблемы (сперва код):
class B
{
public:
BOOL ExecuteThread();
.
.
.
protected:
virtual DWORD vThreadProc();
};
класс просто инициализирует поток, а затем в нужный момент его запускает. Далее
class A
{
public:
A();
~A();
BOOL Init();
BOOL Start();
.
.
.
private:
vector<B> vec;
};
A::A()
{
.
vec.reserve(10);
.
}
A::~A()
{
vector<B>::iterator iter = vec.begin();
while(iter != vec.end())
{
delete iter;
iter++;
}
}
BOOL A::Init(параметры)
{
B *pB;
pB = new B(параметры);
.
vec.push_back(*pB);
.
delete pB;
.
}
BOOL A::Start()
{
vector<B>::iterator iter = vec.begin();
while(iter != vec.end())
{
iter->ExecuteThread();
iter++;
}
}
А теперь суть проблемы. Предположит во время выполнения инициализируются 3 объекта B с различными параметрами, а соответсвенно и 3 различных потока.
Метод A::Init() будет вызван 3 раза, а все объекты упакуются в вектор. Вот тут и проблема: в вектор правильно пишется только первый объект, остадбные записываются (увеличивается размер элементов вектора, но внутри ячейки лежит мусор).
Курез ситуации в том, что исходя из вышепнаписанного должен заработаль только первый поток, посредством B::ExecuteThread(), но они запускаются все, тесть метод A::Start() отрабатывает без ошибок, а итератор возвращает данные правильно.
Зато в деструкторе первый объет уничтожается нормально,а на втором всё падает с Access Violation, тоесть опять в векторе виден только один элемент (правильно виден). Размер вектора при вызове деструктора тоже 3.
В чём моя ошибка, может уже кто сталкивался? Операторы присваивания и конструкторы копирования класса B написаны и отлично работают.
Может нужны какие-то дополниетельные инициализации самого вектора???
Заранее благодарен всем откликнувшимся.
Добавлено форматирование — Кодт