mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-13 10:31:29 +00:00
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:
parent
e811e3975b
commit
76e25f75fa
@ -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)
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user