Merge pull request #2858 from lioncash/leak

DolphinWX: Fix memory leaks occurring in ISOProperties
This commit is contained in:
Lioncash 2015-08-16 05:53:44 -04:00 committed by Jules Blok
parent 83f0ae9ab7
commit 8759d82b8a
2 changed files with 22 additions and 9 deletions

View file

@ -206,17 +206,23 @@ CISOProperties::CISOProperties(const std::string fileName, wxWindow* parent, wxW
{ {
for (u32 i = 0; i < 0xFFFFFFFF; i++) // yes, technically there can be OVER NINE THOUSAND partitions... for (u32 i = 0; i < 0xFFFFFFFF; i++) // yes, technically there can be OVER NINE THOUSAND partitions...
{ {
WiiPartition partition; std::unique_ptr<DiscIO::IVolume> volume(DiscIO::CreateVolumeFromFilename(fileName, group, i));
if ((partition.Partition = DiscIO::CreateVolumeFromFilename(fileName, group, i)) != nullptr) if (volume != nullptr)
{ {
if ((partition.FileSystem = DiscIO::CreateFileSystem(partition.Partition)) != nullptr) std::unique_ptr<DiscIO::IFileSystem> file_system(DiscIO::CreateFileSystem(volume.get()));
if (file_system != nullptr)
{ {
WiiPartition* const partition = new WiiPartition(std::move(volume), std::move(file_system));
wxTreeItemId PartitionRoot = wxTreeItemId PartitionRoot =
m_Treectrl->AppendItem(RootId, wxString::Format(_("Partition %i"), partition_count), 0, 0); m_Treectrl->AppendItem(RootId, wxString::Format(_("Partition %i"), partition_count), 0, 0);
m_Treectrl->SetItemData(PartitionRoot, new WiiPartition(partition));
CreateDirectoryTree(PartitionRoot, partition.FileSystem->GetFileList()); m_Treectrl->SetItemData(PartitionRoot, partition);
CreateDirectoryTree(PartitionRoot, partition->FileSystem->GetFileList());
if (partition_count == 1) if (partition_count == 1)
m_Treectrl->Expand(PartitionRoot); m_Treectrl->Expand(PartitionRoot);
partition_count++; partition_count++;
} }
} }
@ -767,7 +773,7 @@ void CISOProperties::OnExtractFile(wxCommandEvent& WXUNUSED (event))
void CISOProperties::ExportDir(const std::string& _rFullPath, const std::string& _rExportFolder, const WiiPartition* partition) void CISOProperties::ExportDir(const std::string& _rFullPath, const std::string& _rExportFolder, const WiiPartition* partition)
{ {
DiscIO::IFileSystem* const fs = OpenISO->GetVolumeType() == DiscIO::IVolume::WII_DISC ? partition->FileSystem : pFileSystem; DiscIO::IFileSystem* const fs = OpenISO->GetVolumeType() == DiscIO::IVolume::WII_DISC ? partition->FileSystem.get() : pFileSystem;
const std::vector<DiscIO::SFileInfo>& fst = fs->GetFileList(); const std::vector<DiscIO::SFileInfo>& fst = fs->GetFileList();
@ -920,7 +926,7 @@ void CISOProperties::OnExtractDataFromHeader(wxCommandEvent& event)
if (OpenISO->GetVolumeType() == DiscIO::IVolume::WII_DISC) if (OpenISO->GetVolumeType() == DiscIO::IVolume::WII_DISC)
{ {
WiiPartition* partition = reinterpret_cast<WiiPartition*>(m_Treectrl->GetItemData(m_Treectrl->GetSelection())); WiiPartition* partition = reinterpret_cast<WiiPartition*>(m_Treectrl->GetItemData(m_Treectrl->GetSelection()));
FS = partition->FileSystem; FS = partition->FileSystem.get();
} }
else else
{ {

View file

@ -5,8 +5,10 @@
#pragma once #pragma once
#include <cstddef> #include <cstddef>
#include <memory>
#include <set> #include <set>
#include <string> #include <string>
#include <utility>
#include <vector> #include <vector>
#include <wx/dialog.h> #include <wx/dialog.h>
#include <wx/treebase.h> #include <wx/treebase.h>
@ -36,8 +38,13 @@ namespace Gecko { class CodeConfigPanel; }
class WiiPartition final : public wxTreeItemData class WiiPartition final : public wxTreeItemData
{ {
public: public:
DiscIO::IVolume *Partition; WiiPartition(std::unique_ptr<DiscIO::IVolume> partition, std::unique_ptr<DiscIO::IFileSystem> file_system)
DiscIO::IFileSystem *FileSystem; : Partition(std::move(partition)), FileSystem(std::move(file_system))
{
}
std::unique_ptr<DiscIO::IVolume> Partition;
std::unique_ptr<DiscIO::IFileSystem> FileSystem;
}; };
struct PHackData struct PHackData