Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;自毁函数中的SDL_自由表面碰撞_C++_Vector_Sdl_Destructor - Fatal编程技术网

C++ C++;自毁函数中的SDL_自由表面碰撞

C++ C++;自毁函数中的SDL_自由表面碰撞,c++,vector,sdl,destructor,C++,Vector,Sdl,Destructor,我有一个类块,它在析构函数中调用SDL_FreeSurface(surface)。在main()中,当我创建块的实例时,对象正常工作,但当我在另一个类Control中使用它时,该类将vector Block\u vector作为数据成员,当我将Block的实例添加到Block\u vector中时,程序崩溃。调用SDL\u FreeSurface(surface)时,我缩小了问题的范围,即块的析构函数。向向量中添加对象是否与is有关?有什么问题 class Block{ public:

我有一个类
,它在析构函数中调用
SDL_FreeSurface(surface)
。在
main()
中,当我创建块的实例时,对象正常工作,但当我在另一个类
Control
中使用它时,该类将
vector Block\u vector
作为数据成员,当我将
Block
的实例添加到
Block\u vector
中时,程序崩溃。调用
SDL\u FreeSurface(surface)
时,我缩小了问题的范围,即
块的析构函数。向向量中添加对象是否与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++;

    }

    }

    } 

将一个块对象插入向量时,将创建一个副本。因为您没有提供复制构造函数,所以使用编译器生成的复制构造函数。编译器生成的复制构造函数将简单地复制您的指针。它不会复制实际的SDL曲面

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


这几乎可以肯定是导致您崩溃的原因。这就是为什么您需要遵循,并正确地实现复制构造函数和赋值运算符。具体实施取决于您。在大多数情况下,我建议对对象进行完整、深入的复制。但对于像SDL曲面这样的重量级对象,我建议您考虑实现某种引用计数机制,或者将
std::shared\u ptr
与调用
SDL\u FreeSurface
而不是
delete

的自定义删除程序一起使用
std::shared\u ptr
是否验证块的实例是否有效?当我从析构函数中删除
SDL\u FreeSurface
时,程序工作正常。@Unit978:是的,但在这种情况下它可能会泄漏
SDL\u-Surfaces
(这不是一件好事)。这就是为什么我需要知道,当我将SDL_FreeSurface添加到向量中时,为什么在析构函数中调用SDL_FreeSurface会使程序崩溃。正如Mankarse所说,我们需要查看您的代码来确定问题。崩溃发生在向量中创建对象时。甚至还没有调用析构函数。我添加了一个副本构造函数,崩溃仍然发生