Std :: vector инициализируется как мусор. Странное поведение Есть идеи о том, что случилось? - PullRequest
0 голосов
/ 17 сентября 2009

В моем классе есть этот участник.

  std::vector<AvaWrapper> m_controls;

В моем конструкторе я звоню

  m_controls.clear()

Затем я вызываю функцию-член, которая снова выполняет m_controls.clear (), но она взрывается утверждением. Отладчик показывает, что в m_controls содержится полмиллиона или более записей, хотя ни одна из них не является действительной, поскольку при раскрытии дерева отладчик показывает «Ошибка: выражение не может быть оценено». Итак, моя интуиция заключается в том, что класс не создан правильно, потому что этот код работал, но позже я извлек класс из этого класса и вызываю new () для создания родителя. В новой роли в качестве базового класса он взрывается. Однако указатель this показывает, что все остальные переменные-члены имеют допустимые данные, поэтому моя догадка неверна. Конструктор тоже вызывается. Есть идеи? Спасибо.

UPDATE2:

Train::Train() : SpriteWindowFrame(200)
{
  s_mutexProtectingTheGlobalData = new wxMutex();
  m_window_rect = NULL;
  m_thread = NULL;
  m_ok = false;
  m_accumulate_timer = new wxTimer();
  m_accumulate_timer->SetOwner(this, ACCUMULATE_TIMER_ID);

  m_autohide_timer = new wxTimer();
  m_autohide_timer->SetOwner(this, AUTOHIDE_TIMER_ID);

  m_autohide = false;
  m_autohide_period = 5000;
  m_controls.clear();
}

UPDATE:

//This version works.
SpaceInit::SpaceInit()
{
  //Use INI config store. If you need something else, just
  //create the appropriate object.
  m_config_store = new IniConfigStore();

  //Start up config. 
  Init(); 

  m_t = new Trains();
  return;
}

SpaceInit::~SpaceInit()
{
  wxDELETE(m_config_store);
  return;
}

Я могу сделать это: m_t-> SomeMemberFunctionThatManipulatesVector ()

и это работает.

Этот не

SpaceInit::SpaceInit():Trains()
{
  //Use INI config store. If you need something else, just
  //create the appropriate object.
  m_config_store = new IniConfigStore();

  //Start up config. 
  Init(); 
  return;
}

Я не могу сделать: SomeMemberFunctionThatManipulatesVector ()

взрывается на векторе.

Я только что заметил, что этот указатель действительно запутан в констуркторе по умолчанию Train (). Я думал, что это не так, но это так. Поезд конструктор работает но все разрушено.

Код конструктора «Мои поезда» выполняется мельницей. Просто инициализируйте вещи, добавьте пару вещей и т. Д. SpaceInit создается с помощью SpaceInit * t = new SpaceInit (); Train - производный класс, так что, может быть, это как-то связано с ним?

Ответы [ 4 ]

7 голосов
/ 17 сентября 2009

Есть проблема с этим утверждением:

Позже я вывел класс из этого класса и вызываю new () для создания родителя.

Когда вы наследуете класс, вы не вызываете new () для создания родителя. Родительский конструктор уже вызывается до запуска первой строки дочернего конструктора.

Я подозреваю, что ваша проблема может быть в этой области. Возможно, вы могли бы показать нам код, где это происходит.

1 голос
/ 17 сентября 2009

Я с @ Andrew-Shepherd. Поскольку при изменении порядка инициализации класса Trains вы получили разные результаты, я настоятельно рекомендую вам проверить все базовые и производные классы на предмет «списка инициализации».

Если вам не разрешалось показывать конкретный фрагмент кода, по крайней мере, убедитесь, что все члены данных каждого класса были в списке инициализации, а не в ctor.

1 голос
/ 17 сентября 2009

Поскольку у вас, похоже, есть указатели RAW (трудно сказать, поскольку у нас нет определения SpaceInit). Вы определили конструктор копирования и оператор присваивания. Если нет, то вы потенциально можете получить доступ к разрушенным объектам, что приведет к неопределенному поведению, включая перезапись других членов.

0 голосов
/ 17 сентября 2009

Я просто догадываюсь, что метод Init является виртуальным. Правило №. 1, вы не должны вызывать виртуальные методы из ctor, потому что объект не может быть правильно инициализирован.

Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...