mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-02-07 14:58:22 +00:00
(svn r27243) -Fix (r26816) [FS#6285]: Duplicate frees due to pool item classes not having copy constructors.
This commit is contained in:
parent
9de0eccf7f
commit
8ffe068c11
@ -48,21 +48,39 @@ static const SaveLoad _engine_desc[] = {
|
|||||||
SLE_END()
|
SLE_END()
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::vector<Engine> _temp_engine;
|
static std::vector<Engine*> _temp_engine;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocate an Engine structure, but not using the pools.
|
||||||
|
* The allocated Engine must be freed using FreeEngine;
|
||||||
|
* @return Allocated engine.
|
||||||
|
*/
|
||||||
|
static Engine* CallocEngine()
|
||||||
|
{
|
||||||
|
uint8 *zero = CallocT<uint8>(sizeof(Engine));
|
||||||
|
Engine *engine = new (zero) Engine();
|
||||||
|
return engine;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deallocate an Engine constructed by CallocEngine.
|
||||||
|
* @param e Engine to free.
|
||||||
|
*/
|
||||||
|
static void FreeEngine(Engine *e)
|
||||||
|
{
|
||||||
|
if (e != NULL) {
|
||||||
|
e->~Engine();
|
||||||
|
free(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Engine *GetTempDataEngine(EngineID index)
|
Engine *GetTempDataEngine(EngineID index)
|
||||||
{
|
{
|
||||||
if (index < _temp_engine.size()) {
|
if (index < _temp_engine.size()) {
|
||||||
return &_temp_engine[index];
|
return _temp_engine[index];
|
||||||
} else if (index == _temp_engine.size()) {
|
} else if (index == _temp_engine.size()) {
|
||||||
uint8 zero[sizeof(Engine)];
|
_temp_engine.push_back(CallocEngine());
|
||||||
memset(zero, 0, sizeof(zero));
|
return _temp_engine[index];
|
||||||
Engine *engine = new (zero) Engine();
|
|
||||||
|
|
||||||
/* Adding 'engine' to the vector makes a shallow copy, so we do not want to destruct 'engine' */
|
|
||||||
_temp_engine.push_back(*engine);
|
|
||||||
|
|
||||||
return &_temp_engine[index];
|
|
||||||
} else {
|
} else {
|
||||||
NOT_REACHED();
|
NOT_REACHED();
|
||||||
}
|
}
|
||||||
@ -127,6 +145,9 @@ void CopyTempEngineData()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Get rid of temporary data */
|
/* Get rid of temporary data */
|
||||||
|
for (std::vector<Engine*>::iterator it = _temp_engine.begin(); it != _temp_engine.end(); ++it) {
|
||||||
|
FreeEngine(*it);
|
||||||
|
}
|
||||||
_temp_engine.clear();
|
_temp_engine.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user