Fix a few memory leaks

- Rewrite zonename_array to use std::map rather than a pointer to an array
of character pointers

- Properly delete ZoneConfig on Zone shutdown

- Delete AdventureTemplates in AdventureManager destructor
This commit is contained in:
j883376 2013-06-21 17:09:46 -04:00
parent e811e3975b
commit 76e25f75fa
4 changed files with 20 additions and 63 deletions

View File

@ -95,8 +95,6 @@ bool Database::Connect(const char* host, const char* user, const char* passwd, c
void Database::DBInitVars() {
max_zonename = 0;
zonename_array = 0;
varcache_array = 0;
varcache_max = 0;
varcache_lastupdate = 0;
@ -135,13 +133,6 @@ Close the connection to the database
Database::~Database()
{
unsigned int x;
if (zonename_array) {
for (x=0; x<=max_zonename; x++) {
if (zonename_array[x])
safe_delete_array(zonename_array[x]);
}
safe_delete_array(zonename_array);
}
if (varcache_array) {
for (x=0; x<varcache_max; x++) {
safe_delete_array(varcache_array[x]);
@ -1316,39 +1307,13 @@ bool Database::LoadZoneNames() {
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
query = new char[256];
strcpy(query, "SELECT MAX(zoneidnumber) FROM zone");
if (RunQuery(query, strlen(query), errbuf, &result)) {
if (RunQuery(query, MakeAnyLenString(&query, "SELECT zoneidnumber, short_name FROM zone"), errbuf, &result)) {
safe_delete_array(query);
row = mysql_fetch_row(result);
if (row && row[0])
{
max_zonename = atoi(row[0]);
zonename_array = new char*[max_zonename+1];
for(unsigned int i=0; i<max_zonename; i++) {
zonename_array[i] = 0;
}
mysql_free_result(result);
MakeAnyLenString(&query, "SELECT zoneidnumber, short_name FROM zone");
if (RunQuery(query, strlen(query), errbuf, &result)) {
safe_delete_array(query);
while((row = mysql_fetch_row(result))) {
zonename_array[atoi(row[0])] = new char[strlen(row[1]) + 1];
strcpy(zonename_array[atoi(row[0])], row[1]);
Sleep(0);
}
mysql_free_result(result);
}
else {
std::cerr << "Error in LoadZoneNames query '" << query << "' " << errbuf << std::endl;
safe_delete_array(query);
return false;
}
}
else {
mysql_free_result(result);
while ((row = mysql_fetch_row(result))) {
uint32 zoneid = atoi(row[0]);
std::string zonename = row[1];
zonename_array.insert(std::pair<uint32,std::string>(zoneid,zonename));
}
}
else {
@ -1356,39 +1321,27 @@ bool Database::LoadZoneNames() {
safe_delete_array(query);
return false;
}
mysql_free_result(result);
return true;
}
uint32 Database::GetZoneID(const char* zonename) {
if (zonename_array == 0)
return 0;
if (zonename == 0)
return 0;
for (unsigned int i=0; i<=max_zonename; i++) {
if (zonename_array[i] != 0 && strcasecmp(zonename_array[i], zonename) == 0) {
return i;
for (auto iter = zonename_array.begin(); iter != zonename_array.end(); ++iter) {
if (iter->second.compare(zonename) == 0) {
return iter->first;
}
}
return 0;
}
const char* Database::GetZoneName(uint32 zoneID, bool ErrorUnknown) {
if (zonename_array == 0) {
if (ErrorUnknown)
return "UNKNOWN";
else
return 0;
}
auto iter = zonename_array.find(zoneID);
if (zoneID <= max_zonename) {
if (zonename_array[zoneID])
return zonename_array[zoneID];
else {
if (ErrorUnknown)
return "UNKNOWN";
else
return 0;
}
if (iter != zonename_array.end()) {
return iter->second.c_str();
}
else {
if (ErrorUnknown)

View File

@ -255,8 +255,7 @@ protected:
private:
void DBInitVars();
uint32 max_zonename;
char** zonename_array;
std::map<uint32,std::string> zonename_array;
Mutex Mvarcache;
uint32 varcache_max;

View File

@ -27,6 +27,10 @@ AdventureManager::~AdventureManager()
safe_delete(process_timer);
safe_delete(save_timer);
safe_delete(leaderboard_info_timer);
for (auto iter = adventure_templates.begin(); iter != adventure_templates.end(); ++iter) {
delete iter->second;
}
}
void AdventureManager::Process()

View File

@ -72,7 +72,7 @@
#undef new
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif
#ifdef _WINDOWS
#include <conio.h>
#include <process.h>
@ -475,6 +475,7 @@ int main(int argc, char** argv) {
#endif
safe_delete(ps);
safe_delete(mmf);
safe_delete(Config);
if (zone != 0)
Zone::Shutdown(true);