mirror of
https://github.com/hedge-dev/XenonRecomp.git
synced 2026-02-04 04:35:57 +00:00
Fix memory leak: remove static from local variables in Recompile()
Three local variables in recompiler.cpp were declared as 'static', causing unbounded memory growth during recompilation of large executables: - Line 2291: std::unordered_set<size_t> labels - Line 2397: std::string tempString - Line 2645: std::vector<uint8_t> temp Problem: Static local variables persist across function calls and their containers (string, vector, unordered_set) only grow - they never shrink. When recompiling large games with 50,000+ functions: 1. 'tempString' accumulates ALL generated C++ code across every function 2. 'labels' accumulates all label addresses from every function 3. 'temp' accumulates file comparison buffers This was discovered while recompiling GTA IV (~18MB code, ~50k functions). The process consumed 300GB+ RAM and crashed the server after 4 hours. Why it wasn't caught earlier: - Sonic Unleashed (the original target) is smaller - Most test machines have enough RAM to complete before OOM - The static keyword was likely intended as a micro-optimization to avoid repeated allocations, but std::string/vector capacity only increases Fix: Remove 'static' keyword so variables are properly deallocated after each function is processed. Memory usage now stays under 2GB for GTA IV. Tested: Successfully recompiled GTA IV without memory issues.
This commit is contained in:
parent
ddd128bcca
commit
207253d67c
1 changed files with 3 additions and 3 deletions
|
|
@ -2288,7 +2288,7 @@ bool Recompiler::Recompile(const Function& fn)
|
|||
auto end = base + fn.size;
|
||||
auto* data = (uint32_t*)image.Find(base);
|
||||
|
||||
static std::unordered_set<size_t> labels;
|
||||
std::unordered_set<size_t> labels;
|
||||
labels.clear();
|
||||
|
||||
for (size_t addr = base; addr < end; addr += 4)
|
||||
|
|
@ -2394,7 +2394,7 @@ bool Recompiler::Recompile(const Function& fn)
|
|||
|
||||
// TODO: the printing scheme here is scuffed
|
||||
RecompilerLocalVariables localVariables;
|
||||
static std::string tempString;
|
||||
std::string tempString;
|
||||
tempString.clear();
|
||||
std::swap(out, tempString);
|
||||
|
||||
|
|
@ -2642,7 +2642,7 @@ void Recompiler::SaveCurrentOutData(const std::string_view& name)
|
|||
FILE* f = fopen(filePath.c_str(), "rb");
|
||||
if (f)
|
||||
{
|
||||
static std::vector<uint8_t> temp;
|
||||
std::vector<uint8_t> temp;
|
||||
|
||||
fseek(f, 0, SEEK_END);
|
||||
long fileSize = ftell(f);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue