use shared_ptr to avoid possible memory leaks and improve exception-safety
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user