You are sure this snippet is leaking.
SDL_Surface* tempSurface = imageLoader.loadImg("example_image.png");
SDL_BlirSurface(tempSurface, NULL, screen, NULL);
Does that mean loadImg creates a new surface pointer everytime you call
imageLoader.loadImg("example_image.png");
? If so, then you really have to free that surface via imageLoader.unload as soon as you don't need it (i.e. in the update(int) function), because as soon as you exit that update function, you lose access to that surface. If however I guessed wrong, and your loader does cache the surface pointers, then it's all cool. However you did observe steadly growing memory usage, so I'm pretty sure you are creating a new copy with every call to the loader.