mirror of
https://github.com/OpenMW/openmw.git
synced 2025-04-01 20:36:40 +00:00
A better way to plug a potential memory leak in the event of an exception during push_back().
This commit is contained in:
parent
fd67ebde25
commit
3e466699c8
1 changed files with 6 additions and 10 deletions
|
@ -4,6 +4,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
#include <components/esm/loadacti.hpp>
|
#include <components/esm/loadacti.hpp>
|
||||||
#include <components/esm/loadalch.hpp>
|
#include <components/esm/loadalch.hpp>
|
||||||
|
@ -94,16 +95,11 @@ namespace CSMWorld
|
||||||
template<typename RecordT>
|
template<typename RecordT>
|
||||||
void RefIdDataContainer<RecordT>::insertRecord(std::unique_ptr<RecordBase> record)
|
void RefIdDataContainer<RecordT>::insertRecord(std::unique_ptr<RecordBase> record)
|
||||||
{
|
{
|
||||||
// convert base pointer to record type pointer first
|
assert(record != nullptr);
|
||||||
if(Record<RecordT> *tmp = dynamic_cast<Record<RecordT>*>(record.get()))
|
// convert base pointer to record type pointer
|
||||||
{
|
std::unique_ptr<Record<RecordT>> typedRecord(&dynamic_cast<Record<RecordT>&>(*record));
|
||||||
std::unique_ptr<Record<RecordT> > newRecord;
|
record.release();
|
||||||
newRecord.reset(tmp);
|
mContainer.push_back(std::move(typedRecord));
|
||||||
mContainer.push_back(std::move(newRecord));
|
|
||||||
record.release();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
throw std::runtime_error ("invalid record for RefIdDataContainer");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename RecordT>
|
template<typename RecordT>
|
||||||
|
|
Loading…
Reference in a new issue