포인터를위한 딥 복사본을 구현하기 위해 복사 생성자를 사용해야한다는 것을 의미하는 SDL_Surface
포인터를 데이터 멤버로 포함하는 개체를 추가하는 벡터가 있습니다. 객체는 소멸자의 서페이스 (포인터)를 해제하고 이것이 문제가 발생하는 곳입니다. 현재 개체가 벡터에 추가됩니다 (단추를 누름으로써) 프로그램이 충돌하지만, 소멸자 (메모리 누수)에서 SDL_FreeSurface(surface)
을 제거하면 벡터에 개체를 추가 할 때 프로그램에서 크래시가 발생하지 않습니다. 벡터에 개체를 올바르게 추가하려면 어떻게합니까? 어떤 것은 소멸자가 매달려있는 포인터를 지우려고 시도하지만 벡터에서 객체를 생성 할 때 오류가 발생한다고 문제를 생각할 수 있습니다.C++ 벡터에 포인터가있는 개체 추가
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)));
}
}
'shared_ptr'? 왜 그렇게 많은 오버 헤드를 추가하겠습니까? '블록 '을 움직일 수있는 방법을 보여주지 않겠습니까? –
shared_ptr을 사용하면 충돌이 전혀 수정되지 않습니까? – starhacker
@MooingDuck 예 이동식은 여기에 좋은 생각입니다 – marcinj