Fixed some memory leaks. Only one was mine ;P

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7392 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
Jordan Woyak 2011-03-22 07:27:23 +00:00
parent 017735b9ff
commit f8620fcd0b
18 changed files with 89 additions and 99 deletions

View File

@ -31,6 +31,8 @@ namespace AudioCommon
{
SoundStream *InitSoundStream(CMixer *mixer, void *hWnd)
{
// TODO: possible memleak with mixer
std::string backend = ac_Config.sBackend;
if (backend == BACKEND_OPENAL && OpenALStream::isValid())
soundStream = new OpenALStream(mixer);

View File

@ -119,9 +119,12 @@ public:
// Store vectors.
template<class T>
void Do(std::vector<T> &x) {
// TODO
PanicAlert("Do(vector<>) does not yet work.");
void Do(std::vector<T> &x)
{
u32 vec_size = (u32)x.size();
Do(vec_size);
x.resize(vec_size);
DoArray(&x[0], vec_size);
}
// Store strings.
@ -138,23 +141,6 @@ public:
}
(*ptr) += stringLen;
}
void DoBuffer(u8** pBuffer, u32& _Size)
{
Do(_Size);
if (_Size > 0) {
switch (mode) {
case MODE_READ: delete[] *pBuffer; *pBuffer = new u8[_Size]; memcpy(*pBuffer, *ptr, _Size); break;
case MODE_WRITE: memcpy(*ptr, *pBuffer, _Size); break;
case MODE_MEASURE: break;
case MODE_VERIFY: if(*pBuffer) for(u32 i = 0; i < _Size; i++) _dbg_assert_msg_(COMMON, (*pBuffer)[i] == (*ptr)[i], "Savestate verification failure: %d (0x%X) (at %p) != %d (0x%X) (at %p).\n", (*pBuffer)[i], (*pBuffer)[i], &(*pBuffer)[i], (*ptr)[i], (*ptr)[i], &(*ptr)[i]); break;
}
} else {
*pBuffer = NULL;
}
(*ptr) += _Size;
}
template<class T>
void DoArray(T *x, int count) {
@ -260,9 +246,9 @@ public:
u8 *ptr = 0;
PointerWrap p(&ptr, PointerWrap::MODE_MEASURE);
_class.DoState(p);
size_t sz = (size_t)ptr;
u8 *buffer = new u8[sz];
ptr = buffer;
size_t const sz = (size_t)ptr;
std::vector<u8> buffer(sz);
ptr = &buffer[0];
p.SetMode(PointerWrap::MODE_WRITE);
_class.DoState(p);
@ -279,7 +265,7 @@ public:
return false;
}
if (!pFile.WriteBytes(buffer, sz))
if (!pFile.WriteBytes(&buffer[0], sz))
{
ERROR_LOG(COMMON,"ChunkReader: Failed writing data");
return false;

View File

@ -22,6 +22,7 @@
#include <math.h>
#ifdef _WIN32
#include <windows.h>
#include <array>
#else
#include <stdarg.h>
#endif
@ -175,8 +176,8 @@ void ConsoleListener::PixelSpace(int Left, int Top, int Width, int Height, bool
bool DAft = true;
std::string SLog = "";
HWND hWnd = GetConsoleWindow();
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
const HWND hWnd = GetConsoleWindow();
const HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
// Get console info
CONSOLE_SCREEN_BUFFER_INFO ConInfo;
@ -189,30 +190,30 @@ void ConsoleListener::PixelSpace(int Left, int Top, int Width, int Height, bool
DWORD cCharsRead = 0;
COORD coordScreen = { 0, 0 };
std::vector<char*> Str;
std::vector<WORD*> Attr;
static const int MAX_BYTES = 1024 * 16;
std::vector<std::array<CHAR, MAX_BYTES>> Str;
std::vector<std::array<WORD, MAX_BYTES>> Attr;
// ReadConsoleOutputAttribute seems to have a limit at this level
const int MAX_BYTES = 1024 * 16;
int ReadBufferSize = MAX_BYTES - 32;
static const int ReadBufferSize = MAX_BYTES - 32;
DWORD cAttrRead = ReadBufferSize;
DWORD BytesRead = 0;
int i = 0;
int LastAttrRead = 0;
while (BytesRead < BufferSize)
{
Str.push_back(new char[MAX_BYTES]);
if (!ReadConsoleOutputCharacter(hConsole, Str[i], ReadBufferSize, coordScreen, &cCharsRead))
Str.resize(Str.size() + 1);
if (!ReadConsoleOutputCharacter(hConsole, Str.back().data(), ReadBufferSize, coordScreen, &cCharsRead))
SLog += StringFromFormat("WriteConsoleOutputCharacter error");
Attr.push_back(new WORD[MAX_BYTES]);
if (!ReadConsoleOutputAttribute(hConsole, Attr[i], ReadBufferSize, coordScreen, &cAttrRead))
Attr.resize(Attr.size() + 1);
if (!ReadConsoleOutputAttribute(hConsole, Attr.back().data(), ReadBufferSize, coordScreen, &cAttrRead))
SLog += StringFromFormat("WriteConsoleOutputAttribute error");
// Break on error
if (cAttrRead == 0) break;
BytesRead += cAttrRead;
i++;
coordScreen = GetCoordinates(BytesRead, ConInfo.dwSize.X);
LastAttrRead = cAttrRead;
}
// Letter space
int LWidth = (int)(floor((float)Width / 8.0f) - 1.0f);
@ -232,16 +233,16 @@ void ConsoleListener::PixelSpace(int Left, int Top, int Width, int Height, bool
DWORD cAttrWritten = 0;
for (size_t i = 0; i < Attr.size(); i++)
{
if (!WriteConsoleOutputCharacter(hConsole, Str[i], ReadBufferSize, coordScreen, &cCharsWritten))
if (!WriteConsoleOutputCharacter(hConsole, Str[i].data(), ReadBufferSize, coordScreen, &cCharsWritten))
SLog += StringFromFormat("WriteConsoleOutputCharacter error");
if (!WriteConsoleOutputAttribute(hConsole, Attr[i], ReadBufferSize, coordScreen, &cAttrWritten))
if (!WriteConsoleOutputAttribute(hConsole, Attr[i].data(), ReadBufferSize, coordScreen, &cAttrWritten))
SLog += StringFromFormat("WriteConsoleOutputAttribute error");
BytesWritten += cAttrWritten;
coordScreen = GetCoordinates(BytesWritten, LBufWidth);
}
int OldCursor = ConInfo.dwCursorPosition.Y * ConInfo.dwSize.X + ConInfo.dwCursorPosition.X;
const int OldCursor = ConInfo.dwCursorPosition.Y * ConInfo.dwSize.X + ConInfo.dwCursorPosition.X;
COORD Coo = GetCoordinates(OldCursor, LBufWidth);
SetConsoleCursorPosition(hConsole, Coo);

View File

@ -677,7 +677,7 @@ bool WriteStringToFile(bool text_file, const std::string &str, const char *filen
if (!f)
return false;
size_t len = str.size();
if (len != fwrite(str.data(), 1, str.size(), f))
if (len != fwrite(str.data(), 1, str.size(), f)) // TODO: string::data() may not be contiguous
{
fclose(f);
return false;

View File

@ -41,7 +41,6 @@ DSPEmitter::DSPEmitter() : gpr(*this), storeIndex(-1), storeIndex2(-1)
blocks = new DSPCompiledCode[MAX_BLOCKS];
blockLinks = new Block[MAX_BLOCKS];
blockSize = new u16[MAX_BLOCKS];
unresolvedJumps = new std::list<u16>[MAX_BLOCKS];
compileSR = 0;
compileSR |= SR_INT_ENABLE;

View File

@ -260,7 +260,7 @@ public:
u16 startAddr;
Block *blockLinks;
u16 *blockSize;
std::list<u16> *unresolvedJumps;
std::list<u16> unresolvedJumps[MAX_BLOCKS];
DSPJitRegCache gpr;
private:

View File

@ -18,8 +18,8 @@
#ifndef _DSPEMULATOR_H_
#define _DSPEMULATOR_H_
#include "ChunkFile.h"
#include "SoundStream.h"
class DSPEmulator
{
@ -43,6 +43,9 @@ public:
virtual void DSP_Update(int cycles) = 0;
virtual void DSP_StopSoundStream() = 0;
virtual void DSP_ClearAudioBuffer(bool mute) = 0;
protected:
SoundStream *soundStream;
};
DSPEmulator *CreateDSPEmulator(bool LLE);

View File

@ -61,7 +61,6 @@ private:
bool m_bWii;
bool m_InitMixer;
SoundStream *soundStream;
// Fake mailbox utility
struct DSPState

View File

@ -48,7 +48,6 @@ private:
static void dsp_thread(DSPLLE* lpParameter);
std::thread m_hDSPThread;
SoundStream *soundStream;
bool m_InitMixer;
void *m_hWnd;
bool m_bWii;

View File

@ -117,25 +117,21 @@ bool CWII_IPC_HLE_Device_di::IOCtlV(u32 _CommandAddress)
_dbg_assert_msg_(WII_IPC_DVD, CommandBuffer.InBuffer[1].m_Address == 0, "DVDLowOpenPartition with ticket");
_dbg_assert_msg_(WII_IPC_DVD, CommandBuffer.InBuffer[2].m_Address == 0, "DVDLowOpenPartition with cert chain");
bool readOK = false;
// Get TMD offset for requested partition...
u64 TMDOffset = ((u64)Memory::Read_U32(CommandBuffer.InBuffer[0].m_Address + 4) << 2 ) + 0x2c0;
u64 const TMDOffset = ((u64)Memory::Read_U32(CommandBuffer.InBuffer[0].m_Address + 4) << 2 ) + 0x2c0;
INFO_LOG(WII_IPC_DVD, "DVDLowOpenPartition: TMDOffset 0x%016llx", TMDOffset);
u32 TMDsz = 0x208; //CommandBuffer.PayloadBuffer[0].m_Size;
u8 *pTMD = new u8[TMDsz];
if (pTMD)
{
// Read TMD to the buffer
VolumeHandler::RAWReadToPtr(pTMD, TMDOffset, TMDsz);
static u32 const TMDsz = 0x208; //CommandBuffer.PayloadBuffer[0].m_Size;
u8 pTMD[TMDsz];
memcpy(Memory::GetPointer(CommandBuffer.PayloadBuffer[0].m_Address), pTMD, TMDsz);
readOK |= true;
WII_IPC_HLE_Interface::ES_DIVerify(pTMD, TMDsz);
}
ReturnValue = readOK ? 1 : 0;
// Read TMD to the buffer
VolumeHandler::RAWReadToPtr(pTMD, TMDOffset, TMDsz);
memcpy(Memory::GetPointer(CommandBuffer.PayloadBuffer[0].m_Address), pTMD, TMDsz);
WII_IPC_HLE_Interface::ES_DIVerify(pTMD, TMDsz);
ReturnValue = 1;
}
break;

View File

@ -164,7 +164,7 @@ private:
ACLQ(const u8* data, const size_t size, const u16 conn_handle)
: m_size(size), m_conn_handle(conn_handle)
{
m_buffer = new u8[m_size];
m_buffer = new u8[m_size]; // TODO: memleak
memcpy(m_buffer, data, m_size);
}
};

View File

@ -147,6 +147,12 @@ CGameListCtrl::~CGameListCtrl()
{
if (m_imageListSmall)
delete m_imageListSmall;
while (!m_ISOFiles.empty()) // so lazy
{
delete m_ISOFiles.back();
m_ISOFiles.pop_back();
}
}
void CGameListCtrl::InitBitmaps()
@ -276,7 +282,7 @@ void CGameListCtrl::Update()
for (int i = 0; i < (int)m_ISOFiles.size(); i++)
{
InsertItemInReportView(i);
if (m_ISOFiles[i].IsCompressed())
if (m_ISOFiles[i]->IsCompressed())
SetItemTextColour(i, wxColour(0xFF0000));
}
@ -375,7 +381,7 @@ void CGameListCtrl::OnPaintDrawImages(wxPaintEvent& event)
if (GetItemRect(i, itemRect))
{
int itemY = itemRect.GetTop();
const GameListItem& rISOFile = m_ISOFiles[GetItemData(i)];
const GameListItem& rISOFile = *m_ISOFiles[GetItemData(i)];
m_imageListSmall->Draw(m_PlatformImageIndex[rISOFile.GetPlatform()],
dc, itemRect.GetX()+3, itemY);
@ -415,7 +421,7 @@ void CGameListCtrl::InsertItemInReportView(long _Index)
wxCSConv SJISConv(wxFontMapper::GetEncodingName(wxFONTENCODING_EUC_JP));
#endif
GameListItem& rISOFile = m_ISOFiles[_Index];
GameListItem& rISOFile = *m_ISOFiles[_Index];
m_gamePath.append(rISOFile.GetFileName() + '\n');
// Insert a first row with the platform image, that will be used as the Index
@ -612,7 +618,9 @@ void CGameListCtrl::ScanForISOs()
if (!Cont)
break;
GameListItem ISOFile(rFilenames[i]);
GameListItem* const iso_file = new GameListItem(rFilenames[i]);
const GameListItem& ISOFile = *iso_file;
if (ISOFile.IsValid())
{
bool list = true;
@ -665,21 +673,21 @@ void CGameListCtrl::ScanForISOs()
}
if (list)
m_ISOFiles.push_back(ISOFile);
m_ISOFiles.push_back(iso_file);
}
}
}
if (SConfig::GetInstance().m_ListDrives)
{
std::vector<std::string> drives = cdio_get_devices();
GameListItem * Drive[24];
// Another silly Windows limitation of 24 drive letters
for (u32 i = 0; i < drives.size() && i < 24; i++)
const std::vector<std::string> drives = cdio_get_devices();
for (std::vector<std::string>::const_iterator iter = drives.begin(); iter != drives.end(); ++iter)
{
Drive[i] = new GameListItem(drives[i].c_str());
if (Drive[i]->IsValid())
m_ISOFiles.push_back(*Drive[i]);
std::auto_ptr<GameListItem> gli(new GameListItem(*iter));
if (gli->IsValid())
m_ISOFiles.push_back(gli.release());
}
}
@ -692,10 +700,12 @@ void CGameListCtrl::OnColBeginDrag(wxListEvent& event)
event.Veto();
}
const GameListItem *CGameListCtrl::GetISO(int index) const
const GameListItem *CGameListCtrl::GetISO(size_t index) const
{
if (index >= (int)m_ISOFiles.size()) return NULL;
return &m_ISOFiles[index];
if (index < m_ISOFiles.size())
return m_ISOFiles[index];
else
return NULL;
}
CGameListCtrl *caller;
@ -906,7 +916,7 @@ void CGameListCtrl::OnMouseMotion(wxMouseEvent& event)
return;
}
const GameListItem& rISO = m_ISOFiles[GetItemData(item)];
const GameListItem& rISO = *m_ISOFiles[GetItemData(item)];
IniFile ini;
ini.Load(File::GetUserPath(D_GAMECONFIG_IDX) + rISO.GetUniqueID() + ".ini");
@ -1061,7 +1071,7 @@ const GameListItem * CGameListCtrl::GetSelectedISO()
if (GetSelectedItemCount() > 1)
SetItemState(item, 0, wxLIST_STATE_SELECTED);
return &m_ISOFiles[GetItemData(item)];
return m_ISOFiles[GetItemData(item)];
}
}
}

View File

@ -52,7 +52,7 @@ public:
void BrowseForDirectory();
const GameListItem *GetSelectedISO();
const GameListItem *GetISO(int index) const;
const GameListItem *GetISO(size_t index) const;
enum
{
@ -71,7 +71,7 @@ private:
std::vector<int> m_FlagImageIndex;
std::vector<int> m_PlatformImageIndex;
std::vector<int> m_EmuStateImageIndex;
std::vector<GameListItem> m_ISOFiles;
std::vector<GameListItem*> m_ISOFiles;
// NetPlay string for the gamelist
std::string m_gameList;

View File

@ -47,8 +47,6 @@ GameListItem::GameListItem(const std::string& _rFileName)
, m_FileSize(0)
, m_Valid(false)
, m_BlobCompressed(false)
, m_pImage(NULL)
, m_ImageSize(0)
{
if (LoadFromCache())
{
@ -100,9 +98,8 @@ GameListItem::GameListItem(const std::string& _rFileName)
pBannerLoader->GetDescription(m_Description);
if (pBannerLoader->GetBanner(g_ImageTemp))
{
m_ImageSize = DVD_BANNER_WIDTH * DVD_BANNER_HEIGHT * 3;
//use malloc(), since wxImage::Create below calls free() afterwards.
m_pImage = (u8*)malloc(m_ImageSize);
// resize vector to image size
m_pImage.resize(DVD_BANNER_WIDTH * DVD_BANNER_HEIGHT * 3);
for (size_t i = 0; i < DVD_BANNER_WIDTH * DVD_BANNER_HEIGHT; i++)
{
@ -124,14 +121,14 @@ GameListItem::GameListItem(const std::string& _rFileName)
// If not Gamecube, create a cache file only if we have an image.
// Wii isos create their images after you have generated the first savegame
if (m_Platform == GAMECUBE_DISC || m_pImage)
if (m_Platform == GAMECUBE_DISC || !m_pImage.empty())
SaveToCache();
}
}
if (m_pImage)
if (!m_pImage.empty())
{
m_Image.Create(DVD_BANNER_WIDTH, DVD_BANNER_HEIGHT, m_pImage);
m_Image.Create(DVD_BANNER_WIDTH, DVD_BANNER_HEIGHT, &m_pImage[0], true);
}
else
{
@ -173,7 +170,7 @@ void GameListItem::DoState(PointerWrap &p)
p.Do(m_VolumeSize);
p.Do(m_Country);
p.Do(m_BlobCompressed);
p.DoBuffer(&m_pImage, m_ImageSize);
p.Do(m_pImage);
p.Do(m_Platform);
}

View File

@ -26,7 +26,7 @@
#endif
class PointerWrap;
class GameListItem
class GameListItem : NonCopyable
{
public:
GameListItem(const std::string& _rFileName);
@ -78,7 +78,7 @@ private:
#endif
bool m_Valid;
bool m_BlobCompressed;
u8* m_pImage;
std::vector<u8> m_pImage;
u32 m_ImageSize;
bool LoadFromCache();

View File

@ -447,7 +447,7 @@ ControllerInterface::Device* ControllerInterface::FindDevice(const ControllerInt
ControllerInterface::Device::Control* ControllerInterface::InputReference::Detect(const unsigned int ms, Device* const device)
{
unsigned int time = 0;
bool* const states = new bool[device->Inputs().size()];
std::vector<bool> states(device->Inputs().size());
if (device->Inputs().size() == 0)
return NULL;
@ -457,14 +457,14 @@ ControllerInterface::Device::Control* ControllerInterface::InputReference::Detec
std::vector<Device::Input*>::const_iterator
i = device->Inputs().begin(),
e = device->Inputs().end();
for (bool* state=states; i != e; ++i)
for (std::vector<bool>::iterator state = states.begin(); i != e; ++i)
*state++ = ((*i)->GetState() > INPUT_DETECT_THRESHOLD);
while (time < ms)
{
device->UpdateInput();
i = device->Inputs().begin();
for (bool* state=states; i != e; ++i,++state)
for (std::vector<bool>::iterator state = states.begin(); i != e; ++i,++state)
{
// detected an input
if ((*i)->IsDetectable() && (*i)->GetState() > INPUT_DETECT_THRESHOLD)
@ -480,8 +480,6 @@ ControllerInterface::Device::Control* ControllerInterface::InputReference::Detec
Common::SleepCurrentThread(10); time += 10;
}
delete[] states;
// no input was detected
return NULL;
}

View File

@ -114,7 +114,7 @@ void TexDecoder_OpenCL_Initialize()
else
{
binary_size = input.GetSize();
header = new char[HEADER_SIZE];
header = new char[HEADER_SIZE]; // TODO: memleak possible
binary = new char[binary_size];
input.ReadBytes(header, HEADER_SIZE);
input.ReadBytes(binary, binary_size);

View File

@ -1571,7 +1571,7 @@ bool Renderer::SaveScreenshot(const std::string &filename, const TargetRectangle
{
u32 W = back_rc.GetWidth();
u32 H = back_rc.GetHeight();
u8 *data = new u8[3 * W * H];
u8 *data = new u8[3 * W * H]; // TODO: possible memleak, and new'd data is given to wxImage which requires malloc
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glReadPixels(back_rc.left, back_rc.bottom, W, H, GL_RGB, GL_UNSIGNED_BYTE, data);