gpt4 book ai didi

c++ - 内存使用率上升。释放的内存未被重用

转载 作者:可可西里 更新时间:2023-11-01 10:38:34 25 4
gpt4 key购买 nike

我正在使用 debug_new寻找内存泄漏。我正在删除我的对象,而 debug_new 没有显示我泄露它们的任何痕迹。

我读过几个关于内存碎片的线程。但我仍然很困惑。此时我正在测试我的框架,我正在做一个简单的测试。我像这样创建一个新对象:

if(sf::Keyboard::isKeyPressed(sf::Keyboard::Space)){
artemis::Entity& e = world->createEntity();
e.addComponent(new PositionComponent(posX,posY));
e.addComponent(new MovementComponent(500,0));
e.addComponent(new SpriteComponent(TextureManager::getInstance().getTexture("bullet.png")));
e.addComponent(new ColliderComponent(10,10));
e.refresh();
e.setGroup("BULLET");
}

这些“组件”在名为“EntityManager”的管理器中进行管理,该管理器重用实体对象但在将实体发送回“池”时销毁组件。我对此进行了测试,如果池中没有可用实体,则只会创建新实体。

从上面的代码可以看出。在这个简单的测试中,模式是相同的。然而,分配器继续使用新内存,而不是重复使用任何以前使用过的内存。每次空格键命中(每 1/60 帧)创建几千个导致我的内存进入 2 gig 频谱。组件甚至没有那么大。例如:

class ColliderComponent : public artemis::Component{

public:
int width,height,collidionsId;

ColliderComponent(int width, int height){
this->width = width;
this->height = height;
}
};

到目前为止,大多数组件都是简单的整数“集合”。它们非常轻巧。它绝对应该重用一些以前分配/释放的内存。但事实并非如此。

也许我遗漏了什么。有没有人对可能发生的事情有不同的想法?有什么好的(免费的)内存分析器吗?如果不是因为我的组件,缺陷一定是在别的地方。我现在根本看不到它,至少可以说这令人沮丧。

编辑:看起来我忽略了导致重大泄漏的不同部分。这显然是我自己的一个愚蠢错误。

这是罪魁祸首:e.setGroup("子弹");

“BULLET”被保存为一个指针(我应该重新设计它)并且覆盖指向实体 ID 索引处的现有字符串的指针。我不知道为什么我忽略了这一点,但我的内存分配现在很稳定了!

我本可以使用智能指针,但到目前为止我已经从中学到了很多东西!我觉得我取得了一些成就 =D

最佳答案

我在 ColliderComponent 中没有看到重载的 new 运算符,这让我相信你总是从堆中分配内存,并将内存分配给你的 实体管理器。这肯定看起来像泄漏,一旦您的 EntityManager 被破坏,它就会消失。

编辑:我现在更了解您的代码是如何工作的。您的 EntityManager 不缓存组件,只有 Entity 缓存。

关于c++ - 内存使用率上升。释放的内存未被重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11660762/

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