C++ 将带有指针的对象添加到 Vector 中

标签 c++ vector constructor

我有一个 vector ,它添加包含 SDL_Surface 指针的对象作为数据成员,这意味着我必须使用复制构造函数来实现指针的深层复制。该对象释放了析构函数中的表面(指针),这就是问题发生的地方。目前对象被添加到 vector 中(通过按下按钮)程序崩溃但是当我从析构函数中取出 SDL_FreeSurface(surface) 时(内存泄漏)程序在我添加时不会崩溃对象到 vector 。如何正确地将对象添加到 vector 中?有些人可能认为问题在于析构函数试图删除悬挂指针,但错误发生在 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) ) );

       }

     }

最佳答案

您的代码:

BlockVector.push_back(Block (Block(100,100, M_Functions) ) );

看起来非常不理想,它创建了不必要的数据拷贝,看起来需要一些时间才能加载,我的意思是这个 png 在 Block::Block() 中加载。

你能做的最好的事情就是让 BlockVector 成为:

 std::vector<boost::shared_ptr<Block>> blocks;

这样你就不需要制作不必要的 Block 拷贝。否则,您需要将引用计数添加到 Block 类中的 SDL_Surface* 指针,这也可以使用 shared_ptr 和自定义删除器(对于看这里:make shared_ptr not use delete)。

关于C++ 将带有指针的对象添加到 Vector 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12905598/

相关文章:

c++ - 继承和列表

c++ value_type 不适用于 std::map 中的 std::tr1:tuple

c++ - 现代 C++ 编译器是否能够避免在某些情况下两次调用 const 函数?

c++ - 如何避免初始化列表中的代码重复

C++ MatLab 类构造函数重载

c# - 如何创建仅供特定类使用的构造函数。 (C# 中的 C++ Friend 等价物)

c++ - QPen setCosmetic 在高 QGraphicsView 比例下不起作用

c++ - 如何修改 lambda 中的字符串 vector

c++ - 拥有一个整数矩阵 MxN 如何将它们分组为具有 boost 几何形状的多边形?

android - 线性加速方向跟踪手机上下运动