mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-13 23:01:30 +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() {
|
void Database::DBInitVars() {
|
||||||
|
|
||||||
max_zonename = 0;
|
|
||||||
zonename_array = 0;
|
|
||||||
varcache_array = 0;
|
varcache_array = 0;
|
||||||
varcache_max = 0;
|
varcache_max = 0;
|
||||||
varcache_lastupdate = 0;
|
varcache_lastupdate = 0;
|
||||||
@ -135,13 +133,6 @@ Close the connection to the database
|
|||||||
Database::~Database()
|
Database::~Database()
|
||||||
{
|
{
|
||||||
unsigned int x;
|
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) {
|
if (varcache_array) {
|
||||||
for (x=0; x<varcache_max; x++) {
|
for (x=0; x<varcache_max; x++) {
|
||||||
safe_delete_array(varcache_array[x]);
|
safe_delete_array(varcache_array[x]);
|
||||||
@ -1316,39 +1307,13 @@ bool Database::LoadZoneNames() {
|
|||||||
char *query = 0;
|
char *query = 0;
|
||||||
MYSQL_RES *result;
|
MYSQL_RES *result;
|
||||||
MYSQL_ROW row;
|
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);
|
safe_delete_array(query);
|
||||||
row = mysql_fetch_row(result);
|
while ((row = mysql_fetch_row(result))) {
|
||||||
if (row && row[0])
|
uint32 zoneid = atoi(row[0]);
|
||||||
{
|
std::string zonename = row[1];
|
||||||
max_zonename = atoi(row[0]);
|
zonename_array.insert(std::pair<uint32,std::string>(zoneid,zonename));
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -1356,39 +1321,27 @@ bool Database::LoadZoneNames() {
|
|||||||
safe_delete_array(query);
|
safe_delete_array(query);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
mysql_free_result(result);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 Database::GetZoneID(const char* zonename) {
|
uint32 Database::GetZoneID(const char* zonename) {
|
||||||
if (zonename_array == 0)
|
|
||||||
return 0;
|
|
||||||
if (zonename == 0)
|
if (zonename == 0)
|
||||||
return 0;
|
return 0;
|
||||||
for (unsigned int i=0; i<=max_zonename; i++) {
|
for (auto iter = zonename_array.begin(); iter != zonename_array.end(); ++iter) {
|
||||||
if (zonename_array[i] != 0 && strcasecmp(zonename_array[i], zonename) == 0) {
|
if (iter->second.compare(zonename) == 0) {
|
||||||
return i;
|
return iter->first;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* Database::GetZoneName(uint32 zoneID, bool ErrorUnknown) {
|
const char* Database::GetZoneName(uint32 zoneID, bool ErrorUnknown) {
|
||||||
if (zonename_array == 0) {
|
auto iter = zonename_array.find(zoneID);
|
||||||
if (ErrorUnknown)
|
|
||||||
return "UNKNOWN";
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (zoneID <= max_zonename) {
|
if (iter != zonename_array.end()) {
|
||||||
if (zonename_array[zoneID])
|
return iter->second.c_str();
|
||||||
return zonename_array[zoneID];
|
|
||||||
else {
|
|
||||||
if (ErrorUnknown)
|
|
||||||
return "UNKNOWN";
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (ErrorUnknown)
|
if (ErrorUnknown)
|
||||||
|
|||||||
@ -255,8 +255,7 @@ protected:
|
|||||||
private:
|
private:
|
||||||
void DBInitVars();
|
void DBInitVars();
|
||||||
|
|
||||||
uint32 max_zonename;
|
std::map<uint32,std::string> zonename_array;
|
||||||
char** zonename_array;
|
|
||||||
|
|
||||||
Mutex Mvarcache;
|
Mutex Mvarcache;
|
||||||
uint32 varcache_max;
|
uint32 varcache_max;
|
||||||
|
|||||||
@ -27,6 +27,10 @@ AdventureManager::~AdventureManager()
|
|||||||
safe_delete(process_timer);
|
safe_delete(process_timer);
|
||||||
safe_delete(save_timer);
|
safe_delete(save_timer);
|
||||||
safe_delete(leaderboard_info_timer);
|
safe_delete(leaderboard_info_timer);
|
||||||
|
|
||||||
|
for (auto iter = adventure_templates.begin(); iter != adventure_templates.end(); ++iter) {
|
||||||
|
delete iter->second;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdventureManager::Process()
|
void AdventureManager::Process()
|
||||||
|
|||||||
@ -72,7 +72,7 @@
|
|||||||
#undef new
|
#undef new
|
||||||
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
|
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _WINDOWS
|
#ifdef _WINDOWS
|
||||||
#include <conio.h>
|
#include <conio.h>
|
||||||
#include <process.h>
|
#include <process.h>
|
||||||
@ -475,6 +475,7 @@ int main(int argc, char** argv) {
|
|||||||
#endif
|
#endif
|
||||||
safe_delete(ps);
|
safe_delete(ps);
|
||||||
safe_delete(mmf);
|
safe_delete(mmf);
|
||||||
|
safe_delete(Config);
|
||||||
|
|
||||||
if (zone != 0)
|
if (zone != 0)
|
||||||
Zone::Shutdown(true);
|
Zone::Shutdown(true);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user