From 295db5f0649662cf46a0dc9bb5daf33e9464de64 Mon Sep 17 00:00:00 2001 From: elasota Date: Tue, 11 May 2021 01:29:40 -0400 Subject: [PATCH] Fix memory leak --- Aerofoil/GpFileStream_Win32.cpp | 28 +++++++++++++++++++++++++--- Aerofoil/GpFileStream_Win32.h | 7 ++++++- Aerofoil/GpFileSystem_Win32.cpp | 2 +- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/Aerofoil/GpFileStream_Win32.cpp b/Aerofoil/GpFileStream_Win32.cpp index b196094..c82804f 100644 --- a/Aerofoil/GpFileStream_Win32.cpp +++ b/Aerofoil/GpFileStream_Win32.cpp @@ -1,13 +1,32 @@ #include "GpFileStream_Win32.h" +#include "IGpAllocator.h" -GpFileStream_Win32::GpFileStream_Win32(HANDLE handle, bool readable, bool writeable, bool seekable) - : m_handle(handle) +#include + +GpFileStream_Win32::GpFileStream_Win32(IGpAllocator *alloc, HANDLE handle, bool readable, bool writeable, bool seekable) + : m_alloc(alloc) + , m_handle(handle) , m_readable(readable) , m_writeable(writeable) , m_seekable(seekable) { } +GpFileStream_Win32 *GpFileStream_Win32::Create(IGpAllocator *alloc, HANDLE handle, bool readable, bool writeable, bool seekable) +{ + void *storage = alloc->Alloc(sizeof(GpFileStream_Win32)); + if (!storage) + return nullptr; + + return new (storage) GpFileStream_Win32(alloc, handle, readable, writeable, seekable); +} + + +GpFileStream_Win32::~GpFileStream_Win32() +{ + CloseHandle(m_handle); +} + size_t GpFileStream_Win32::Read(void *bytesOut, size_t size) { if (!m_readable) @@ -122,7 +141,10 @@ GpUFilePos_t GpFileStream_Win32::Tell() const void GpFileStream_Win32::Close() { - CloseHandle(m_handle); + IGpAllocator *alloc = m_alloc; + this->~GpFileStream_Win32(); + + alloc->Release(this); } void GpFileStream_Win32::Flush() diff --git a/Aerofoil/GpFileStream_Win32.h b/Aerofoil/GpFileStream_Win32.h index 9a2767b..6267a9c 100644 --- a/Aerofoil/GpFileStream_Win32.h +++ b/Aerofoil/GpFileStream_Win32.h @@ -7,7 +7,7 @@ class GpFileStream_Win32 final : public GpIOStream { public: - explicit GpFileStream_Win32(HANDLE handle, bool readable, bool writeable, bool seekable); + ~GpFileStream_Win32(); size_t Read(void *bytesOut, size_t size) override; size_t Write(const void *bytes, size_t size) override; @@ -26,7 +26,12 @@ public: void Close(); #endif + static GpFileStream_Win32 *Create(IGpAllocator *alloc, HANDLE handle, bool readable, bool writeable, bool seekable); + private: + GpFileStream_Win32(IGpAllocator *alloc, HANDLE handle, bool readable, bool writeable, bool seekable); + + IGpAllocator *m_alloc; HANDLE m_handle; bool m_readable; bool m_writeable; diff --git a/Aerofoil/GpFileSystem_Win32.cpp b/Aerofoil/GpFileSystem_Win32.cpp index 77e7be6..36c22c5 100644 --- a/Aerofoil/GpFileSystem_Win32.cpp +++ b/Aerofoil/GpFileSystem_Win32.cpp @@ -290,7 +290,7 @@ GpIOStream *GpFileSystem_Win32::OpenFileNested(PortabilityLayer::VirtualDirector if (h == INVALID_HANDLE_VALUE) return false; - return new GpFileStream_Win32(h, true, writeAccess, true); + return GpFileStream_Win32::Create(m_alloc, h, true, writeAccess, true); } bool GpFileSystem_Win32::DeleteFile(PortabilityLayer::VirtualDirectory_t virtualDirectory, const char *path, bool &existed)