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) ) );
}
}
Your code:
looks very suboptimal, it creates unnecessary copies of data that looks like requires some time to load, I mean this png loading in
Block::Block().The best what you can do is to make BlockVector to be:
this way you wont need to make unnecessary copies of Block. Otherwise you would need to add reference counting to your
SDL_Surface*pointers inBlockclass, this can also be done withshared_ptrand custom deleter (for that look here: make shared_ptr not use delete).