mirror of
https://github.com/GabsPuNs/Project-Zenith-Main.git
synced 2026-06-24 05:26:09 +00:00
Fix multiple memory leaks and stale pooled allocations
* Fix Vec3/AABB pool reset logic
* resetPool()/clearPool() now reset poolPointer to 0
* Prevents endless pool growth, invalid temporary references,
and increasing memory usage
* Resolves the leaderboard-related crash mentioned in
Windows64_Minecraft.cpp
* Properly free old screens in Minecraft::setScreen()
* Added virtual destructor to Screen
* Screen destructor now cleans up GuiParticles and Buttons
* Previous screen is now deleted after screen transitions
* Screen::init() now clears old buttons/particles before re-init
* Fix GuiParticles memory leak
* Removed GuiParticle instances are now deleted in tick()
* Added GuiParticles destructor to free remaining particles
This commit is contained in:
@@ -8,6 +8,15 @@ GuiParticles::GuiParticles(Minecraft *mc)
|
||||
this->mc = mc;
|
||||
}
|
||||
|
||||
GuiParticles::~GuiParticles()
|
||||
{
|
||||
for (GuiParticle *gp : particles)
|
||||
{
|
||||
delete gp;
|
||||
}
|
||||
particles.clear();
|
||||
}
|
||||
|
||||
void GuiParticles::tick()
|
||||
{
|
||||
for (unsigned int i = 0; i < particles.size(); i++)
|
||||
@@ -19,6 +28,7 @@ void GuiParticles::tick()
|
||||
|
||||
if (gp->removed)
|
||||
{
|
||||
delete gp;
|
||||
particles.erase(particles.begin()+i);
|
||||
i--;
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ private:
|
||||
|
||||
public:
|
||||
GuiParticles(Minecraft *mc);
|
||||
~GuiParticles();
|
||||
void tick();
|
||||
void add(GuiParticle *guiParticle);
|
||||
void render(float a);
|
||||
|
||||
@@ -504,9 +504,10 @@ LevelStorageSource *Minecraft::getLevelSource()
|
||||
|
||||
void Minecraft::setScreen(Screen *screen)
|
||||
{
|
||||
if (this->screen != nullptr)
|
||||
Screen *oldScreen = this->screen;
|
||||
if (oldScreen != nullptr)
|
||||
{
|
||||
this->screen->removed();
|
||||
oldScreen->removed();
|
||||
}
|
||||
|
||||
#ifdef _WINDOWS64
|
||||
|
||||
@@ -23,6 +23,18 @@ Screen::Screen() // 4J added
|
||||
clickedButton = nullptr;
|
||||
}
|
||||
|
||||
Screen::~Screen()
|
||||
{
|
||||
delete particles;
|
||||
particles = nullptr;
|
||||
|
||||
for (Button *button : buttons)
|
||||
{
|
||||
delete button;
|
||||
}
|
||||
buttons.clear();
|
||||
}
|
||||
|
||||
void Screen::render(int xm, int ym, float a)
|
||||
{
|
||||
for (Button* button : buttons)
|
||||
|
||||
@@ -22,6 +22,7 @@ public:
|
||||
GuiParticles *particles;
|
||||
|
||||
Screen(); // 4J added
|
||||
virtual ~Screen();
|
||||
virtual void render(int xm, int ym, float a);
|
||||
protected:
|
||||
virtual void keyPressed(wchar_t eventCharacter, int eventKey);
|
||||
|
||||
@@ -54,10 +54,16 @@ AABB *AABB::newPermanent(double x0, double y0, double z0, double x1, double y1,
|
||||
|
||||
void AABB::clearPool()
|
||||
{
|
||||
ThreadStorage *tls = static_cast<ThreadStorage *>(TlsGetValue(tlsIdx));
|
||||
if (tls != nullptr)
|
||||
{
|
||||
tls->poolPointer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void AABB::resetPool()
|
||||
{
|
||||
clearPool();
|
||||
}
|
||||
|
||||
AABB *AABB::newTemp(double x0, double y0, double z0, double x1, double y1, double z1)
|
||||
|
||||
@@ -47,10 +47,16 @@ Vec3 *Vec3::newPermanent(double x, double y, double z)
|
||||
|
||||
void Vec3::clearPool()
|
||||
{
|
||||
ThreadStorage *tls = static_cast<ThreadStorage *>(TlsGetValue(tlsIdx));
|
||||
if (tls != nullptr)
|
||||
{
|
||||
tls->poolPointer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void Vec3::resetPool()
|
||||
{
|
||||
clearPool();
|
||||
}
|
||||
|
||||
Vec3 *Vec3::newTemp(double x, double y, double z)
|
||||
|
||||
Reference in New Issue
Block a user