gpt4 book ai didi

C++ SDL_FreeSurface 在析构函数中崩溃

转载 作者:行者123 更新时间:2023-11-30 02:59:35 27 4
gpt4 key购买 nike

我有一个类Block这叫SDL_FreeSurface(surface)在析构函数中。在main()当我创建 Block 的一个实例时,该对象正常运行,但当我在另一个类中使用它时 Control , 其中有 vector<Block> block_vector作为数据成员,当我添加 Block 的实例时程序崩溃进入block_vector .我缩小了问题的范围,即 Block 的析构函数打电话时 SDL_FreeSurface(surface) .向 vector 中添加对象与 is 有什么关系吗?有什么问题?

 class Block{

public:

Block(int x, int y);
~Block();


void Load_Image(MediaFunctions &M_Functions);

void SetPosition(int x, int y);

void BlitBlock(SDL_Event &event, MediaFunctions &M_Functions, SDL_Surface *destination);


bool DetectionNames(SDL_Event &event, MediaFunctions &M_Functions, SDL_Surface *destination);

bool DetectionHours(SDL_Event &event, MediaFunctions &M_Functions, SDL_Surface *destination);

bool return_error();



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;


bool error;

};


//the problem
Block::~Block(){


SDL_FreeSurface(block_surface_hours);
SDL_FreeSurface(block_surface_names);

SDL_FreeSurface(block_hours_detected);
SDL_FreeSurface(block_names_detected);

}



//when doing this
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
BlockVector.push_back(Block (Block(100,100)));
BlockVector.at(block_index).Load_Image(M_Functions);

block_index++;

}

}

}

最佳答案

当您将一个 Block 对象插入 vector 时,会生成一个拷贝。由于您没有提供复制构造函数,因此使用了编译器生成的复制构造函数。编译器生成的复制构造函数将简单地复制您的指针。它不会复制实际的 SDL 表面。

这意味着您的原始 Block 对象和插入 vector 中的 Block 对象都具有指向相同 SDL 表面的指针。当其中一个 Block 对象的生命周期结束时,将调用析构函数,从而释放 SDL 表面。现在另一个 Block 对象有一个悬空指针,当它的生命周期结束时,析构函数被调用,您可以在悬空指针上调用 SDL_FreeSurface。

这几乎可以肯定是导致崩溃的原因。这就是为什么您需要遵循 Rule of Three ,并正确实现复制构造函数和赋值运算符。实现由您决定。在大多数情况下,我建议对您的对象进行完整的深度复制。但是对于 SDL 表面这样的重量级对象,我建议您考虑实现某种引用计数机制,或者将 std::shared_ptr 与调用 SDL_FreeSurface 的自定义删除器一起使用而不是 delete

关于C++ SDL_FreeSurface 在析构函数中崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12792592/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com