std::vector. как правильно упаковать в вектор объект
От: Аноним  
Дата: 04.09.06 14:27
Оценка:
Доброго времени суток,

столкнулся с интересной проблемой при использовании 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 написаны и отлично работают.
Может нужны какие-то дополниетельные инициализации самого вектора???

Заранее благодарен всем откликнувшимся.

Добавлено форматирование — Кодт
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.