I have a vector that adds objects that contain SDL_Surface
pointers as data members which means i have to use a copy constructor to implement a deep copy for the pointers. The object frees the surfaces(pointers) in the destructor and this is where the problem occurs. At the moment the object is added into the vector(by pressing a button) the program crashes but when i take away the SDL_FreeSurface(surface)
from the destructor(memory leak) the program doesnt crash when i add the object to the vector. How do I properly add the objects into the vector? Some may think the problem is that the destructor is trying to delete dangling pointers but the error occurs upon the creation of the object in the vector.
class Block{
public:
Block(int x, int y, MediaFunctions &M_Functions);
Block(const Block& source);
~Block();
private:
SDL_Surface *block_surface_names;
SDL_Surface *block_surface_hours;
SDL_Surface *block_names_detected;
SDL_Surface *block_hours_detected;
SDL_Rect block_rect_names;
SDL_Rect block_rect_hours;
};
////////////////////
Block::Block(int x, int y, MediaFunctions &M_Functions){
block_surface_names = M_Functions.LoadOptimizedImage("block_names.png");
block_surface_hours = M_Functions.LoadOptimizedImage("block_hours.png");
block_names_detected = M_Functions.LoadOptimizedImag("block_names_detected.png");
block_hours_detected = M_Functions.LoadOptimizedImag("block_hours_detected.png");
block_rect_names.x = x;
block_rect_names.y = y;
block_rect_names.w = block_surface_names -> w;
block_rect_names.h = block_surface_names -> h;
block_rect_hours.x = block_rect_names.x + block_rect_names.w;
block_rect_hours.y = block_rect_names.y;
block_rect_hours.w = block_surface_hours -> w;
block_rect_hours.h = block_surface_hours -> h;
}
//copy
Block::Block(const Block& source)
{
block_surface_names = source.block_surface_names;
block_surface_hours = source.block_surface_hours;
block_names_detected = source.block_names_detected;
block_hours_detected = source.block_hours_detected;
}
Block::~Block(){
//having this is necessary obviously- crashes program
//removing this causes the program not to crash
SDL_FreeSurface(block_surface_hours);
SDL_FreeSurface(block_surface_names);
SDL_FreeSurface(block_hours_detected);
SDL_FreeSurface(block_names_detected);
}
//where the object with SDL_FreeSurface() in the dtor is added to vector - crash!
void Control::HandleEvents(SDL_Event &event, MediaFunctions &M_Functions){
if(event.type == SDL_KEYDOWN){
if( event.key.keysym.sym == SDLK_a )
//append a block instance using copy constructor
BlockVector.push_back(Block (Block(100,100, M_Functions) ) );
}
}