From e257db4defed563002eb9d9267140f672a3548b9 Mon Sep 17 00:00:00 2001 From: Sour Date: Sat, 16 Feb 2019 01:16:57 -0500 Subject: [PATCH] Fixed memory leaks --- Core/BaseCartridge.h | 6 ++++++ Core/Console.cpp | 3 ++- Core/DmaController.cpp | 2 +- Core/DmaController.h | 4 ++-- Core/MemoryManager.h | 23 +++++++++++------------ Core/Ppu.cpp | 25 ++++++++++++++++--------- Core/Ppu.h | 1 + 7 files changed, 39 insertions(+), 25 deletions(-) diff --git a/Core/BaseCartridge.h b/Core/BaseCartridge.h index 2ddcc28..b117196 100644 --- a/Core/BaseCartridge.h +++ b/Core/BaseCartridge.h @@ -13,6 +13,12 @@ private: uint32_t _saveRamSize = 0; public: + ~BaseCartridge() + { + delete[] _prgRom; + delete[] _saveRam; + } + static shared_ptr CreateCartridge(VirtualFile romFile, VirtualFile patchFile) { if(romFile.IsValid()) { diff --git a/Core/Console.cpp b/Core/Console.cpp index 6a60956..db6504e 100644 --- a/Core/Console.cpp +++ b/Core/Console.cpp @@ -48,6 +48,7 @@ void Console::Stop() _cpu.reset(); _ppu.reset(); + _cart.reset(); _memoryManager.reset(); } @@ -60,7 +61,7 @@ void Console::LoadRom(VirtualFile romFile, VirtualFile patchFile) _ppu.reset(new Ppu(shared_from_this())); _cart = cart; _memoryManager.reset(new MemoryManager()); - _memoryManager->Initialize(cart, shared_from_this()); + _memoryManager->Initialize(shared_from_this()); _cpu.reset(new Cpu(_memoryManager)); diff --git a/Core/DmaController.cpp b/Core/DmaController.cpp index ab24ca9..d08a293 100644 --- a/Core/DmaController.cpp +++ b/Core/DmaController.cpp @@ -2,7 +2,7 @@ #include "DmaController.h" #include "MemoryManager.h" -DmaController::DmaController(shared_ptr memoryManager) +DmaController::DmaController(MemoryManager *memoryManager) { _memoryManager = memoryManager; } diff --git a/Core/DmaController.h b/Core/DmaController.h index f803115..6a692c7 100644 --- a/Core/DmaController.h +++ b/Core/DmaController.h @@ -27,13 +27,13 @@ private: }; DmaChannelConfig _channel[8] = {}; - shared_ptr _memoryManager; + MemoryManager *_memoryManager; void RunSingleTransfer(DmaChannelConfig &channel, uint32_t &bytesLeft); void RunDma(DmaChannelConfig &channel); public: - DmaController(shared_ptr memoryManager); + DmaController(MemoryManager *memoryManager); void Write(uint16_t addr, uint8_t value); }; \ No newline at end of file diff --git a/Core/MemoryManager.h b/Core/MemoryManager.h index d305d61..93a1ef0 100644 --- a/Core/MemoryManager.h +++ b/Core/MemoryManager.h @@ -10,16 +10,14 @@ class CpuRegisterHandler : public IMemoryHandler { private: - shared_ptr _ppu; - shared_ptr _memoryManager; - unique_ptr _dmaController; + Ppu *_ppu; + DmaController *_dmaController; public: - CpuRegisterHandler(shared_ptr console) + CpuRegisterHandler(Ppu *ppu, DmaController *dmaController) { - _ppu = console->GetPpu(); - _memoryManager = console->GetMemoryManager(); - _dmaController.reset(new DmaController(_memoryManager)); + _ppu = ppu; + _dmaController = dmaController; } uint8_t Read(uint32_t addr) override @@ -70,8 +68,7 @@ private: shared_ptr _cart; shared_ptr _cpuRegisterHandler; shared_ptr _ppu; - - unique_ptr _dmaController; + shared_ptr _dmaController; uint32_t _wramPosition; @@ -79,15 +76,16 @@ private: uint64_t _lastMasterClock; public: - void Initialize(shared_ptr cart, shared_ptr console) + void Initialize(shared_ptr console) { _lastMasterClock = 0; _masterClock = 0; _console = console; - _cart = cart; + _cart = console->GetCartridge(); _ppu = console->GetPpu(); - _cpuRegisterHandler.reset(new CpuRegisterHandler(console)); + _dmaController.reset(new DmaController(console->GetMemoryManager().get())); + _cpuRegisterHandler.reset(new CpuRegisterHandler(_ppu.get(), _dmaController.get())); memset(_handlers, 0, sizeof(_handlers)); _workRam = new uint8_t[MemoryManager::WorkRamSize]; @@ -117,6 +115,7 @@ public: ~MemoryManager() { + delete[] _workRam; } void RegisterHandler(uint32_t startAddr, uint32_t endAddr, IMemoryHandler* handler) diff --git a/Core/Ppu.cpp b/Core/Ppu.cpp index 96cd955..554f7e3 100644 --- a/Core/Ppu.cpp +++ b/Core/Ppu.cpp @@ -10,27 +10,34 @@ Ppu::Ppu(shared_ptr console) { _console = console; - _vram = new uint8_t[Ppu::VideoRamSize]; - memset(_vram, 0, Ppu::VideoRamSize); + _outputBuffers[0] = new uint16_t[256 * 224]; + _outputBuffers[1] = new uint16_t[256 * 224]; + + _currentBuffer = _outputBuffers[0]; _layerConfig[0] = {}; _layerConfig[1] = {}; _layerConfig[2] = {}; _layerConfig[3] = {}; - _outputBuffers[0] = new uint16_t[256 * 224]; - _outputBuffers[1] = new uint16_t[256 * 224]; - - _currentBuffer = _outputBuffers[0]; - _cgramAddress = 0; + _vram = new uint8_t[Ppu::VideoRamSize]; + memset(_vram, 0, Ppu::VideoRamSize); + _vramAddress = 0; _vramIncrementValue = 1; _vramAddressRemapping = 0; _vramAddrIncrementOnSecondReg = false; } +Ppu::~Ppu() +{ + delete[] _vram; + delete[] _outputBuffers[0]; + delete[] _outputBuffers[1]; +} + PpuState Ppu::GetState() { return { @@ -164,12 +171,12 @@ void Ppu::Write(uint32_t addr, uint8_t value) case 0x2116: //VMADDL - VRAM Address low byte - _vramAddress = (_vramAddress & 0xFF00) | value; + _vramAddress = (_vramAddress & 0x7F00) | value; break; case 0x2117: //VMADDH - VRAM Address high byte - _vramAddress = (_vramAddress & 0x00FF) | (value << 8); + _vramAddress = (_vramAddress & 0x00FF) | ((value & 0x7F) << 8); break; case 0x2118: diff --git a/Core/Ppu.h b/Core/Ppu.h index 56c2f85..3d729f0 100644 --- a/Core/Ppu.h +++ b/Core/Ppu.h @@ -39,6 +39,7 @@ private: public: Ppu(shared_ptr console); + ~Ppu(); PpuState GetState();