【问题标题】:Destroying a vector of ALLEGRO_BITMAP*销毁 ALLEGRO_BITMAP* 的向量
【发布时间】:2023-04-01 02:35:01
【问题描述】:

我使用库 Allegro5。 在我的动画类中,我有vector<ALLEGRO_BITMAP*> sprites。 在构造函数中,我用一些位图填充它,在析构函数中我想正确删除它。但是,我的解决方案仍然会导致内存泄漏:

for each (ALLEGRO_BITMAP* it in sprites)
{
    al_destroy_bitmap(it);
}

for (auto it : sprites)
    delete it;

sprites.~vector();

或任何其他组合。

我真的不知道为什么它没有正确删除。

编辑:

现在我有了这个,仍然有一个小的内存泄漏,但大小小于 1 MB

class Deleter
{
public:
void operator()(ALLEGRO_BITMAP* ptrToBitmap)
    {
        cout << "deleted"<<'\n';
        al_destroy_bitmap(ptrToBitmap);
    }
};

vector<unique_ptr<ALLEGRO_BITMAP, Deleter>> sprites;

for (int i = 0; i < 100; i++)
{
    ALLEGRO_BITMAP* temp = al_load_bitmap("Fireball1.png");
    unique_ptr<ALLEGRO_BITMAP, Deleter> uptr;
    uptr = unique_ptr<ALLEGRO_BITMAP, Deleter>(temp);

    sprites.push_back(move(uptr));
}

sprites.~vector();

【问题讨论】:

  • 每个是什么?为什么不在删除 *it 之前在基于的范围内调用 al_destroy_bitmap(*it)。
  • 它只是用于测试,工作方式相同,但你是对的我宁愿这样发布它

标签: c++ vector memory-leaks allegro allegro5


【解决方案1】:

不要将sprites 设为std::vector&lt;ALLEGRO_BITMAP*&gt;,将其设为std::vector&lt;std::unique_ptr&lt;ALLEGRO_BITMAP*,al_destroy_bitmap&gt;&gt;。这样,当sprites 的析构函数被调用时(或者当你将它的大小调整为零时),unique_ptr 析构函数将释放位图。

【讨论】:

  • 谢谢,我试试。到目前为止,我对 unique_ptr 一无所知,所以请等待我接受答案,直到我对它了解足够多后再进行测试。 (明天)
  • 我试过了,但我不知道如何将 al_destroy_bitmap 设为删除器...
  • 您可能需要创建一个具有operator() 的类并从中调用al_destroy_bitmap
  • 我按照你说的做了,但它没有调用这个函数来破坏向量。我的代码在上面的问题中写为 EDIT。
  • 我明白了为什么,现在它调用了删除器。但是,它仍然占用了指针本身的大小。
猜你喜欢
  • 2018-07-03
  • 2012-12-23
  • 1970-01-01
  • 2013-05-24
  • 2020-01-10
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多