Store ini sections in a std::list (rather than vector) to prevent unexpected pointer invalidation with use of GetOrCreateSection.

This commit is contained in:
Jordan Woyak 2014-06-24 12:28:02 -05:00
parent 4138702336
commit 516369594f
2 changed files with 4 additions and 3 deletions

View File

@ -233,7 +233,7 @@ IniFile::Section* IniFile::GetOrCreateSection(const std::string& sectionName)
if (!section) if (!section)
{ {
sections.push_back(Section(sectionName)); sections.push_back(Section(sectionName));
section = &sections[sections.size() - 1]; section = &sections.back();
} }
return section; return section;
} }
@ -323,7 +323,7 @@ bool IniFile::GetLines(const std::string& sectionName, std::vector<std::string>*
void IniFile::SortSections() void IniFile::SortSections()
{ {
std::sort(sections.begin(), sections.end()); sections.sort();
} }
bool IniFile::Load(const std::string& filename, bool keep_current_data) bool IniFile::Load(const std::string& filename, bool keep_current_data)

View File

@ -5,6 +5,7 @@
#pragma once #pragma once
#include <cstring> #include <cstring>
#include <list>
#include <map> #include <map>
#include <string> #include <string>
#include <vector> #include <vector>
@ -116,7 +117,7 @@ public:
Section* GetOrCreateSection(const std::string& section); Section* GetOrCreateSection(const std::string& section);
private: private:
std::vector<Section> sections; std::list<Section> sections;
const Section* GetSection(const std::string& section) const; const Section* GetSection(const std::string& section) const;
Section* GetSection(const std::string& section); Section* GetSection(const std::string& section);