aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2010-06-06 15:32:08 +0200
committerJay Berkenbilt <ejb@ql.org>2010-06-06 15:32:08 +0200
commit9496b2cb20bfd0551e9510b6ccb41ca950d2c8ee (patch)
treed4dd988984a8730331087b8b7e7afc513aeb2164 /libqpdf
parent64dc738859bac0dd71a3b0e61ba2d2c171d9eecd (diff)
downloadqpdf-9496b2cb20bfd0551e9510b6ccb41ca950d2c8ee.tar.zst
fix memory leak
git-svn-id: svn+q:///qpdf/trunk@976 71b93d88-0707-0410-a8cf-f5a4172ac649
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDF.cc7
-rw-r--r--libqpdf/QPDFObjectHandle.cc16
-rw-r--r--libqpdf/QPDF_Array.cc10
-rw-r--r--libqpdf/QPDF_Dictionary.cc11
-rw-r--r--libqpdf/qpdf/QPDF_Array.hh3
-rw-r--r--libqpdf/qpdf/QPDF_Dictionary.hh3
6 files changed, 50 insertions, 0 deletions
diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc
index 44ea7d24..f68efc83 100644
--- a/libqpdf/QPDF.cc
+++ b/libqpdf/QPDF.cc
@@ -277,6 +277,13 @@ QPDF::QPDF() :
QPDF::~QPDF()
{
+ this->xref_table.clear();
+ for (std::map<ObjGen, ObjCache>::iterator iter = this->obj_cache.begin();
+ iter != obj_cache.end(); ++iter)
+ {
+ QPDFObject::ObjAccessor::releaseResolved(
+ (*iter).second.object.getPointer());
+ }
}
void
diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc
index 6fb66d9c..022c9e05 100644
--- a/libqpdf/QPDFObjectHandle.cc
+++ b/libqpdf/QPDFObjectHandle.cc
@@ -41,6 +41,22 @@ QPDFObjectHandle::QPDFObjectHandle(QPDFObject* data) :
{
}
+void
+QPDFObjectHandle::releaseResolved()
+{
+ if (isIndirect())
+ {
+ if (this->obj.getPointer())
+ {
+ this->obj = 0;
+ }
+ }
+ else
+ {
+ QPDFObject::ObjAccessor::releaseResolved(this->obj.getPointer());
+ }
+}
+
bool
QPDFObjectHandle::isInitialized() const
{
diff --git a/libqpdf/QPDF_Array.cc b/libqpdf/QPDF_Array.cc
index b7227f0d..ae70bd67 100644
--- a/libqpdf/QPDF_Array.cc
+++ b/libqpdf/QPDF_Array.cc
@@ -10,6 +10,16 @@ QPDF_Array::~QPDF_Array()
{
}
+void
+QPDF_Array::releaseResolved()
+{
+ for (std::vector<QPDFObjectHandle>::iterator iter = this->items.begin();
+ iter != this->items.end(); ++iter)
+ {
+ QPDFObjectHandle::ReleaseResolver::releaseResolved(*iter);
+ }
+}
+
std::string
QPDF_Array::unparse()
{
diff --git a/libqpdf/QPDF_Dictionary.cc b/libqpdf/QPDF_Dictionary.cc
index 36c4590d..ccaab4a8 100644
--- a/libqpdf/QPDF_Dictionary.cc
+++ b/libqpdf/QPDF_Dictionary.cc
@@ -13,6 +13,17 @@ QPDF_Dictionary::~QPDF_Dictionary()
{
}
+void
+QPDF_Dictionary::releaseResolved()
+{
+ for (std::map<std::string, QPDFObjectHandle>::iterator iter =
+ this->items.begin();
+ iter != this->items.end(); ++iter)
+ {
+ QPDFObjectHandle::ReleaseResolver::releaseResolved((*iter).second);
+ }
+}
+
std::string
QPDF_Dictionary::unparse()
{
diff --git a/libqpdf/qpdf/QPDF_Array.hh b/libqpdf/qpdf/QPDF_Array.hh
index fce36a4c..490df723 100644
--- a/libqpdf/qpdf/QPDF_Array.hh
+++ b/libqpdf/qpdf/QPDF_Array.hh
@@ -16,6 +16,9 @@ class QPDF_Array: public QPDFObject
QPDFObjectHandle getItem(int n) const;
void setItem(int, QPDFObjectHandle const&);
+ protected:
+ virtual void releaseResolved();
+
private:
std::vector<QPDFObjectHandle> items;
};
diff --git a/libqpdf/qpdf/QPDF_Dictionary.hh b/libqpdf/qpdf/QPDF_Dictionary.hh
index a6b1e77b..e75de01b 100644
--- a/libqpdf/qpdf/QPDF_Dictionary.hh
+++ b/libqpdf/qpdf/QPDF_Dictionary.hh
@@ -27,6 +27,9 @@ class QPDF_Dictionary: public QPDFObject
// Remove key, doing nothing if key does not exist
void removeKey(std::string const& key);
+ protected:
+ virtual void releaseResolved();
+
private:
std::map<std::string, QPDFObjectHandle> items;
};