From 3ff8838e01ac56acdb8ea12aa14eb57e6cd60e83 Mon Sep 17 00:00:00 2001 From: Riyyi Date: Thu, 29 Aug 2024 22:56:21 +0200 Subject: [PATCH] Render: Fix memory leak, use after free :^) --- src/inferno/render/buffer.cpp | 7 ++++--- src/inferno/render/renderer.cpp | 10 +++++----- src/inferno/render/renderer.h | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/inferno/render/buffer.cpp b/src/inferno/render/buffer.cpp index 7639776..a8a8770 100644 --- a/src/inferno/render/buffer.cpp +++ b/src/inferno/render/buffer.cpp @@ -424,10 +424,11 @@ void VertexArray::addVertexBuffer(std::shared_ptr vertexBuffer) index++; } - m_vertexBuffers.push_back(std::move(vertexBuffer)); unbind(); vertexBuffer->unbind(); + + m_vertexBuffers.push_back(std::move(vertexBuffer)); } void VertexArray::setIndexBuffer(std::shared_ptr indexBuffer) @@ -435,10 +436,10 @@ void VertexArray::setIndexBuffer(std::shared_ptr indexBuffer) bind(); indexBuffer->bind(); - m_indexBuffer = std::move(indexBuffer); - unbind(); indexBuffer->unbind(); + + m_indexBuffer = std::move(indexBuffer); } } // namespace Inferno diff --git a/src/inferno/render/renderer.cpp b/src/inferno/render/renderer.cpp index a02459f..b458d4b 100644 --- a/src/inferno/render/renderer.cpp +++ b/src/inferno/render/renderer.cpp @@ -550,20 +550,20 @@ void Renderer3D::createElementBuffer() // CPU // Create array for storing quads vertices - m_elementBufferBase = new uint32_t[maxElements]; - m_elementBufferPtr = m_elementBufferBase; + m_elementBufferBase = std::make_unique(maxElements); + m_elementBufferPtr = m_elementBufferBase.get(); // --------------------------------- // GPU // Create index buffer - auto indexBuffer = std::make_shared(m_elementBufferBase, sizeof(uint32_t) * maxElements); + auto indexBuffer = std::make_shared(m_elementBufferBase.get(), sizeof(uint32_t) * maxElements); m_vertexArray->setIndexBuffer(indexBuffer); } void Renderer3D::uploadElementBuffer() { - m_vertexArray->indexBuffer()->uploadData(m_elementBufferBase, m_elementIndex * sizeof(uint32_t)); + m_vertexArray->indexBuffer()->uploadData(m_elementBufferBase.get(), m_elementIndex * sizeof(uint32_t)); } void Renderer3D::loadShader() @@ -574,7 +574,7 @@ void Renderer3D::loadShader() void Renderer3D::startBatch() { Renderer::startBatch(); - m_elementBufferPtr = m_elementBufferBase; + m_elementBufferPtr = m_elementBufferBase.get(); } // ----------------------------------------- diff --git a/src/inferno/render/renderer.h b/src/inferno/render/renderer.h index b65ff15..a78f57a 100644 --- a/src/inferno/render/renderer.h +++ b/src/inferno/render/renderer.h @@ -222,7 +222,7 @@ private: private: // CPU element vertices - uint32_t* m_elementBufferBase { nullptr }; + std::unique_ptr m_elementBufferBase { nullptr }; uint32_t* m_elementBufferPtr { nullptr }; };