Ваша проблема, как вы уже догадались, здесь:
FrameData myFrame;
std::vector<FrameData> frames;
...snipped...
frames.push_back(myFrame);
Вектор создает копии элементов, которые вы вставляете. Что у вас есть для вашего конструктора копирования и / или operator=
для вашего класса? Если вы ничего не определили, то версия по умолчанию, которую создает для вас компилятор, просто делает копии членов вашего класса. Это скопирует элементы указателя red
, green
и blue
в новый экземпляр. Тогда старый скопированный вами экземпляр будет уничтожен, когда он выйдет из области видимости, и указатели будут удалены. Тогда тот, который вы скопировали в вектор, будет иметь недопустимые указатели, так как цель указателя, таким образом, будет удалена.
Хорошее практическое правило заключается в том, что если у вас есть необработанные члены-указатели, вам необходимо создать конструктор копирования и operator=
, который будет корректно обрабатывать эту ситуацию, убедившись, что указатели получают новые значения и не используются совместно. или что право собственности передается между экземплярами.
Например, класс std::auto_ptr
имеет необработанный указатель - семантика конструктора копирования заключается в передаче владения указателем цели.
Класс boost::shared_ptr
имеет необработанный указатель - семантика состоит в том, чтобы делить владение с помощью подсчета ссылок. Это хороший способ обработать std::vectors
, содержащий указатели для вашего класса - общие указатели будут контролировать владение вами.
Другим способом может быть использование векторов вместо указателей ваших членов - указатели на членов в любом случае просто являются псевдонимами для ваших массивов, поэтому вектор является хорошей заменой.