Я пишу игру код C++, чтобы узнать его и игру dev, обернув SDL по пути; все, что он делает прямо сейчас, это загрузка изображения BMP и отображение его на экране в цикле. Проводка только соответствующего кода.Указатель Invalidation с std :: vector
EDIT: Я пересматриваю это сообщение до MVCE. Проблема может быть найдена гораздо более непосредственно.
#include <SDL.h>
#include <vector>
class Surface {
public:
Surface(SDL_Surface*);
~Surface();
SDL_Surface* mSurface;
}
Surface::Surface(SDL_Surface* surface) {
mSurface = surface;
}
Surface::~Surface() {
SDL_FreeSurface(mSurface);
}
int main(int argc, char* args[])
{
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
throw("Failed to SDL_Init: " + std::string(SDL_GetError()));
}
SDL_Window* window = SDL_CreateWindow("SDL TEST", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 1280, 960, SDL_WINDOW_SHOWN);
SDL_Surface* screenSurface = SDL_GetWindowSurface(window);
const char * imgPath = "test.bmp";
std::vector<Surface> surfaces;
surfaces.push_back(Surface(SDL_LoadBMP(imgPath)));
SDL_BlitSurface(surfaces.begin()->mSurface, // memory access violation here
NULL, screenSurface, NULL);
SDL_UpdateWindowSurface(window);
SDL_Delay(2000);
SDL_Quit();
return 0;
}
Что это сводится к тому, что указатель внутри Surface
объекта, загруженного в vector
становится недействительным. Я читал вокруг и подумал, что, возможно, это было связано с нуждаясь пользовательский конструктор копирования, но сделать один, как это не решить:
Surface::Surface(const Surface& other) {
mSurface = other.mSurface;
mIsWindowSurface = other.mIsWindowSurface;
}
Если 'SDL_BlitSurface' отлично работает с жестким кодированным контуром, то вам, вероятно, стоит попробовать стрелять в' loadMedia'. Может быть, проверить возвращаемое значение 'SDL_LoadBmp' перед конструктором' Surface'? Есть ли какой-либо SDL API для получения последней ошибки? Я никогда не работал с SDL, чтобы предлагать такой API для поиска ошибок. – elimad
@elimad, указатели все выглядят нормально в точке, в которой вызывается 'SDL_BlitSurface'. Я также использовал 'SDL_GetError', чтобы узнать, установлено ли что-либо перед blitting, но ничего не выходит. Существует некоторая недействительность между тем, когда 'Surface' создается в' loadMedia' и когда указатель из него используется в 'update'; но он становится «фиксированным», если эти две строки раскоментированы (даже не используются). – esel
Как вы инициализируете 'mWindowSurface.pointer()' скорее, 'mWindowSurface'? – elimad