Fixed memory leaks

This commit is contained in:
Sour 2019-02-16 01:16:57 -05:00
parent 5b1f62ab8e
commit e257db4def
7 changed files with 39 additions and 25 deletions

View file

@ -13,6 +13,12 @@ private:
uint32_t _saveRamSize = 0;
public:
~BaseCartridge()
{
delete[] _prgRom;
delete[] _saveRam;
}
static shared_ptr<BaseCartridge> CreateCartridge(VirtualFile romFile, VirtualFile patchFile)
{
if(romFile.IsValid()) {

View file

@ -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));

View file

@ -2,7 +2,7 @@
#include "DmaController.h"
#include "MemoryManager.h"
DmaController::DmaController(shared_ptr<MemoryManager> memoryManager)
DmaController::DmaController(MemoryManager *memoryManager)
{
_memoryManager = memoryManager;
}

View file

@ -27,13 +27,13 @@ private:
};
DmaChannelConfig _channel[8] = {};
shared_ptr<MemoryManager> _memoryManager;
MemoryManager *_memoryManager;
void RunSingleTransfer(DmaChannelConfig &channel, uint32_t &bytesLeft);
void RunDma(DmaChannelConfig &channel);
public:
DmaController(shared_ptr<MemoryManager> memoryManager);
DmaController(MemoryManager *memoryManager);
void Write(uint16_t addr, uint8_t value);
};

View file

@ -10,16 +10,14 @@
class CpuRegisterHandler : public IMemoryHandler
{
private:
shared_ptr<Ppu> _ppu;
shared_ptr<MemoryManager> _memoryManager;
unique_ptr<DmaController> _dmaController;
Ppu *_ppu;
DmaController *_dmaController;
public:
CpuRegisterHandler(shared_ptr<Console> 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<BaseCartridge> _cart;
shared_ptr<CpuRegisterHandler> _cpuRegisterHandler;
shared_ptr<Ppu> _ppu;
unique_ptr<DmaController> _dmaController;
shared_ptr<DmaController> _dmaController;
uint32_t _wramPosition;
@ -79,15 +76,16 @@ private:
uint64_t _lastMasterClock;
public:
void Initialize(shared_ptr<BaseCartridge> cart, shared_ptr<Console> console)
void Initialize(shared_ptr<Console> 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)

View file

@ -10,27 +10,34 @@ Ppu::Ppu(shared_ptr<Console> 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:

View file

@ -39,6 +39,7 @@ private:
public:
Ppu(shared_ptr<Console> console);
~Ppu();
PpuState GetState();