use shared_ptr to avoid possible memory leaks and improve exception-safety

This commit is contained in:
wmayer
2019-09-03 17:15:24 +02:00
parent c4b0073022
commit 10cd535ceb
3 changed files with 11 additions and 14 deletions

View File

@@ -335,8 +335,8 @@ void Base::XMLReader::readFiles(zipios::ZipInputStream &zipstream) const
try {
Base::Reader reader(zipstream, jt->FileName, FileVersion);
jt->Object->RestoreDocFile(reader);
if ( reader.getLocalReader() != nullptr )
reader.getLocalReader()->readFiles(zipstream);
if (reader.getLocalReader())
reader.getLocalReader()->readFiles(zipstream);
}
catch(...) {
// For any exception we just continue with the next file.
@@ -565,8 +565,6 @@ Base::Reader::Reader(std::istream& str, const std::string& name, int version)
Base::Reader::~Reader()
{
if ( this->localreader != nullptr )
delete this->localreader;
}
std::string Base::Reader::getFileName() const
@@ -584,13 +582,12 @@ std::istream& Base::Reader::getStream()
return this->_str;
}
void Base::Reader::initLocalReader(Base::XMLReader *ptr)
void Base::Reader::initLocalReader(std::shared_ptr<Base::XMLReader> reader)
{
this->localreader=ptr;
this->localreader = reader;
}
Base::XMLReader *Base::Reader::getLocalReader()
std::shared_ptr<Base::XMLReader> Base::Reader::getLocalReader() const
{
return(this->localreader);
return(this->localreader);
}

View File

@@ -27,6 +27,7 @@
#include <string>
#include <map>
#include <bitset>
#include <memory>
#include <xercesc/framework/XMLPScanToken.hpp>
#include <xercesc/sax2/Attributes.hpp>
@@ -299,14 +300,14 @@ public:
std::istream& getStream();
std::string getFileName() const;
int getFileVersion() const;
void initLocalReader(Base::XMLReader *ptr);
Base::XMLReader *getLocalReader();
void initLocalReader(std::shared_ptr<Base::XMLReader>);
std::shared_ptr<Base::XMLReader> getLocalReader() const;
private:
std::istream& _str;
std::string _name;
int fileVersion;
Base::XMLReader *localreader=nullptr;
std::shared_ptr<Base::XMLReader> localreader;
};
}

View File

@@ -1189,8 +1189,7 @@ void Document::Restore(Base::XMLReader &reader)
void Document::RestoreDocFile(Base::Reader &reader)
{
// We must create an XML parser to read from the input stream
Base::XMLReader *localreader;
localreader = new Base::XMLReader("GuiDocument.xml", reader);
std::shared_ptr<Base::XMLReader> localreader = std::make_shared<Base::XMLReader>("GuiDocument.xml", reader);
localreader->FileVersion = reader.getFileVersion();
localreader->readElement("Document");