diff --git a/glib/poppler-annot.cc b/glib/poppler-annot.cc
index 312aa31..936cc07 100644
--- a/glib/poppler-annot.cc
+++ b/glib/poppler-annot.cc
@@ -267,25 +267,20 @@
 static AnnotQuadrilaterals *
 create_annot_quads_from_poppler_quads (GArray *quads)
 {
-  AnnotQuadrilaterals::AnnotQuadrilateral **quads_array;
-
   g_assert (quads->len > 0);
 
-  quads_array = (AnnotQuadrilaterals::AnnotQuadrilateral **) g_malloc0_n (
-    sizeof (AnnotQuadrilaterals::AnnotQuadrilateral *),
-    quads->len);
-
+  auto quads_array = std::make_unique<AnnotQuadrilaterals::AnnotQuadrilateral[]>(quads->len);
   for (guint i = 0; i < quads->len; i++) {
     PopplerQuadrilateral *quadrilateral = &g_array_index (quads, PopplerQuadrilateral, i);
 
-    quads_array[i] = new AnnotQuadrilaterals::AnnotQuadrilateral (
+    quads_array[i] = AnnotQuadrilaterals::AnnotQuadrilateral (
       quadrilateral->p1.x, quadrilateral->p1.y,
       quadrilateral->p2.x, quadrilateral->p2.y,
       quadrilateral->p3.x, quadrilateral->p3.y,
       quadrilateral->p4.x, quadrilateral->p4.y);
   }
 
-  return new AnnotQuadrilaterals (quads_array, quads->len);
+  return new AnnotQuadrilaterals (std::move(quads_array), quads->len);
 }
 
 static GArray *
@@ -947,15 +942,15 @@
   return poppler_color;
 }
 
-static AnnotColor *
+static std::unique_ptr<AnnotColor>
 create_annot_color_from_poppler_color (PopplerColor *poppler_color)
 {
   if (!poppler_color)
-    return NULL;
+    return nullptr;
 
-  return new AnnotColor ((double)poppler_color->red / 65535,
-                         (double)poppler_color->green / 65535,
-                         (double)poppler_color->blue / 65535);
+  return std::make_unique<AnnotColor>((double)poppler_color->red / 65535,
+                                      (double)poppler_color->green / 65535,
+                                      (double)poppler_color->blue / 65535);
 }
 
 /**
@@ -988,7 +983,6 @@
 poppler_annot_set_color (PopplerAnnot *poppler_annot,
 			 PopplerColor *poppler_color)
 {
-  /* Annot takes ownership of the color */
   poppler_annot->annot->setColor (create_annot_color_from_poppler_color (poppler_color));
 }
 
@@ -1150,15 +1144,13 @@
 				PopplerRectangle   *popup_rect)
 {
   AnnotMarkup *annot;
-  AnnotPopup  *popup;
   PDFRectangle pdf_rect(popup_rect->x1, popup_rect->y1,
 			popup_rect->x2, popup_rect->y2);
 
   g_return_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot));
 
   annot = static_cast<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot);
-  popup = new AnnotPopup (annot->getDoc(), &pdf_rect);
-  annot->setPopup (popup);
+  annot->setPopup (std::make_unique<AnnotPopup>(annot->getDoc(), &pdf_rect));
 }
 
 /**
@@ -1946,7 +1938,6 @@
 
   annot = static_cast<AnnotGeometry *>(POPPLER_ANNOT (poppler_annot)->annot);
 
-  /* Annot takes ownership of the color */
   annot->setInteriorColor (create_annot_color_from_poppler_color (poppler_color));
 }
 
diff --git a/poppler/Annot.cc b/poppler/Annot.cc
index 7e1941c..6832735 100644
--- a/poppler/Annot.cc
+++ b/poppler/Annot.cc
@@ -184,8 +184,7 @@
   return type;
 }
 
-PDFRectangle *parseDiffRectangle(Array *array, PDFRectangle *rect) {
-  PDFRectangle *newRect = NULL;
+static std::unique_ptr<PDFRectangle> parseDiffRectangle(Array *array, PDFRectangle *rect) {
   if (array->getLength() == 4) {
     // deltas
     Object obj1;
@@ -199,14 +198,15 @@
     if (dx1 >= 0 && dy1 >= 0 && dx2 >= 0 && dy2
         && (rect->x2 - rect->x1 - dx1 - dx2) >= 0
         && (rect->y2 - rect->y1 - dy1 - dy2) >= 0) {
-      newRect = new PDFRectangle();
+      auto newRect = std::make_unique<PDFRectangle>();
       newRect->x1 = rect->x1 + dx1;
       newRect->y1 = rect->y1 + dy1;
       newRect->x2 = rect->x2 - dx2;
       newRect->y2 = rect->y2 - dy2;
+      return newRect;
     }
   }
-  return newRect;
+  return nullptr;
 }
 
 static LinkAction* getAdditionalAction(Annot::AdditionalActionsType type, Object *additionalActions, PDFDoc *doc) {
@@ -283,51 +283,39 @@
 //------------------------------------------------------------------------
 
 AnnotPath::AnnotPath() {
-  coords = NULL;
   coordsLength = 0;
 }
 
 AnnotPath::AnnotPath(Array *array) {
-  coords = NULL;
   coordsLength = 0;
   parsePathArray(array);
 }
 
-AnnotPath::AnnotPath(AnnotCoord **coords, int coordsLength) {
-  this->coords = coords;
+AnnotPath::AnnotPath(std::unique_ptr<AnnotCoord[]> &&coords, int coordsLength) {
+  this->coords = std::move(coords);
   this->coordsLength = coordsLength;
 }
 
-AnnotPath::~AnnotPath() {
-  if (coords) {
-    for (int i = 0; i < coordsLength; ++i)
-      delete coords[i];
-    gfree(coords);
-  }
-}
-
 double AnnotPath::getX(int coord) const {
   if (coord >= 0 && coord < coordsLength)
-    return coords[coord]->getX();
+    return coords[coord].getX();
   return 0;
 }
 
 double AnnotPath::getY(int coord) const {
   if (coord >= 0 && coord < coordsLength)
-    return coords[coord]->getY();
+    return coords[coord].getY();
   return 0;
 }
 
 AnnotCoord *AnnotPath::getCoord(int coord) const {
   if (coord >= 0 && coord < coordsLength)
-    return coords[coord];
+    return &coords[coord];
   return NULL;
 }
 
 void AnnotPath::parsePathArray(Array *array) {
   int tempLength;
-  AnnotCoord **tempCoords;
-  GBool correct = gTrue;
 
   if (array->getLength() % 2) {
     error(errSyntaxError, -1, "Bad Annot Path");
@@ -335,36 +323,28 @@
   }
 
   tempLength = array->getLength() / 2;
-  tempCoords = (AnnotCoord **) gmallocn (tempLength, sizeof(AnnotCoord *));
-  memset(tempCoords, 0, tempLength * sizeof(AnnotCoord *));
-  for (int i = 0; i < tempLength && correct; i++) {
+  auto tempCoords = std::make_unique<AnnotCoord[]>(tempLength);
+  for (int i = 0; i < tempLength; i++) {
     double x = 0, y = 0;
 
     Object obj1 = array->get(i * 2);
     if (obj1.isNum()) {
       x = obj1.getNum();
     } else {
-      correct = gFalse;
+      return;
     }
 
     obj1 = array->get((i * 2) + 1);
     if (obj1.isNum()) {
       y = obj1.getNum();
     } else {
-      correct = gFalse;
-    }
-
-    if (!correct) {
-      for (int j = i - 1; j >= 0; j--)
-        delete tempCoords[j];
-      gfree (tempCoords);
       return;
     }
 
-    tempCoords[i] = new AnnotCoord(x, y);
+    tempCoords[i] = { x, y };
   }
 
-  coords = tempCoords;
+  coords = std::move(tempCoords);
   coordsLength = tempLength;
 }
 
@@ -391,114 +371,90 @@
 
 AnnotQuadrilaterals::AnnotQuadrilaterals(Array *array, PDFRectangle *rect) {
   int arrayLength = array->getLength();
-  GBool correct = gTrue;
   int quadsLength = 0;
-  AnnotQuadrilateral **quads;
   double quadArray[8];
 
   // default values
-  quadrilaterals = NULL;
   quadrilateralsLength = 0;
 
   if ((arrayLength % 8) == 0) {
     int i;
 
     quadsLength = arrayLength / 8;
-    quads = (AnnotQuadrilateral **) gmallocn
-        ((quadsLength), sizeof(AnnotQuadrilateral *));
-    memset(quads, 0, quadsLength * sizeof(AnnotQuadrilateral *));
-
+    auto quads = std::make_unique<AnnotQuadrilateral[]>(quadsLength);
     for (i = 0; i < quadsLength; i++) {
       for (int j = 0; j < 8; j++) {
         Object obj = array->get(i * 8 + j);
         if (obj.isNum()) {
           quadArray[j] = obj.getNum();
         } else {
-            correct = gFalse;
 	    error (errSyntaxError, -1, "Invalid QuadPoint in annot");
-	    break;
+	    return;
         }
       }
 
-      if (!correct)
-        break;
-
-      quads[i] = new AnnotQuadrilateral(quadArray[0], quadArray[1],
-					quadArray[2], quadArray[3],
-					quadArray[4], quadArray[5],
-					quadArray[6], quadArray[7]);
+      quads[i] = AnnotQuadrilateral(quadArray[0], quadArray[1],
+                                    quadArray[2], quadArray[3],
+                                    quadArray[4], quadArray[5],
+                                    quadArray[6], quadArray[7]);
     }
 
-    if (correct) {
-      quadrilateralsLength = quadsLength;
-      quadrilaterals = quads;
-    } else {
-      for (int j = 0; j < i; j++)
-        delete quads[j];
-      gfree (quads);
-    }
+
+    quadrilateralsLength = quadsLength;
+    quadrilaterals = std::move(quads);
   }
 }
 
-AnnotQuadrilaterals::AnnotQuadrilaterals(AnnotQuadrilaterals::AnnotQuadrilateral **quads, int quadsLength) {
-  quadrilaterals = quads;
+AnnotQuadrilaterals::AnnotQuadrilaterals(std::unique_ptr<AnnotQuadrilateral[]> &&quads, int quadsLength) {
+  quadrilaterals = std::move(quads);
   quadrilateralsLength = quadsLength;
 }
 
-AnnotQuadrilaterals::~AnnotQuadrilaterals() {
-  if (quadrilaterals) {
-    for(int i = 0; i < quadrilateralsLength; i++)
-      delete quadrilaterals[i];
-
-    gfree (quadrilaterals);
-  }
-}
-
 double AnnotQuadrilaterals::getX1(int quadrilateral) {
   if (quadrilateral >= 0  && quadrilateral < quadrilateralsLength)
-    return quadrilaterals[quadrilateral]->coord1.getX();
+    return quadrilaterals[quadrilateral].coord1.getX();
   return 0;
 }
 
 double AnnotQuadrilaterals::getY1(int quadrilateral) {
   if (quadrilateral >= 0  && quadrilateral < quadrilateralsLength)
-    return quadrilaterals[quadrilateral]->coord1.getY();
+    return quadrilaterals[quadrilateral].coord1.getY();
   return 0;
 }
 
 double AnnotQuadrilaterals::getX2(int quadrilateral) {
   if (quadrilateral >= 0  && quadrilateral < quadrilateralsLength)
-    return quadrilaterals[quadrilateral]->coord2.getX();
+    return quadrilaterals[quadrilateral].coord2.getX();
   return 0;
 }
 
 double AnnotQuadrilaterals::getY2(int quadrilateral) {
   if (quadrilateral >= 0  && quadrilateral < quadrilateralsLength)
-    return quadrilaterals[quadrilateral]->coord2.getY();
+    return quadrilaterals[quadrilateral].coord2.getY();
   return 0;
 }
 
 double AnnotQuadrilaterals::getX3(int quadrilateral) {
   if (quadrilateral >= 0  && quadrilateral < quadrilateralsLength)
-    return quadrilaterals[quadrilateral]->coord3.getX();
+    return quadrilaterals[quadrilateral].coord3.getX();
   return 0;
 }
 
 double AnnotQuadrilaterals::getY3(int quadrilateral) {
   if (quadrilateral >= 0  && quadrilateral < quadrilateralsLength)
-    return quadrilaterals[quadrilateral]->coord3.getY();
+    return quadrilaterals[quadrilateral].coord3.getY();
   return 0;
 }
 
 double AnnotQuadrilaterals::getX4(int quadrilateral) {
   if (quadrilateral >= 0  && quadrilateral < quadrilateralsLength)
-    return quadrilaterals[quadrilateral]->coord4.getX();
+    return quadrilaterals[quadrilateral].coord4.getX();
   return 0;
 }
 
 double AnnotQuadrilaterals::getY4(int quadrilateral) {
   if (quadrilateral >= 0  && quadrilateral < quadrilateralsLength)
-    return quadrilaterals[quadrilateral]->coord4.getY();
+    return quadrilaterals[quadrilateral].coord4.getY();
   return 0;
 }
 
@@ -890,12 +846,11 @@
   return res;
 }
 
-GooString * AnnotAppearance::getStateKey(int i) {
-  GooString * res = NULL;
+std::unique_ptr<GooString> AnnotAppearance::getStateKey(int i) {
   Object obj1 = appearDict.dictLookupNF("N");
   if (obj1.isDict())
-    res = new GooString(obj1.dictGetKey(i));
-  return res;
+    return std::make_unique<GooString>(obj1.dictGetKey(i));
+  return nullptr;
 }
 
 int AnnotAppearance::getNumStates() {
@@ -1015,52 +970,36 @@
   if (obj1.isArray()) {
     Array *colorComponents = obj1.getArray();
     if (colorComponents->getLength() > 0) {
-      borderColor = new AnnotColor(colorComponents);
-    } else {
-      borderColor = NULL;
+      borderColor = std::make_unique<AnnotColor>(colorComponents);
     }
-  } else {
-    borderColor = NULL;
   }
 
   obj1 = dict->lookup("BG");
   if (obj1.isArray()) {
     Array *colorComponents = obj1.getArray();
     if (colorComponents->getLength() > 0) {
-      backColor = new AnnotColor(colorComponents);
-    } else {
-      backColor = NULL;
+      backColor = std::make_unique<AnnotColor>(colorComponents);
     }
-  } else {
-    backColor = NULL;
   }
 
   obj1 = dict->lookup("CA");
   if (obj1.isString()) {
-    normalCaption = new GooString(obj1.getString());
-  } else {
-    normalCaption = NULL;
+    normalCaption = std::make_unique<GooString>(obj1.getString());
   }
 
   obj1 = dict->lookup("RC");
   if (obj1.isString()) {
-    rolloverCaption = new GooString(obj1.getString());
-  } else {
-    rolloverCaption = NULL;
+    rolloverCaption = std::make_unique<GooString>(obj1.getString());
   }
 
   obj1 = dict->lookup("AC");
   if (obj1.isString()) {
-    alternateCaption = new GooString(obj1.getString());
-  } else {
-    alternateCaption = NULL;
+    alternateCaption = std::make_unique<GooString>(obj1.getString());
   }
 
   obj1 = dict->lookup("IF");
   if (obj1.isDict()) {
-    iconFit = new AnnotIconFit(obj1.getDict());
-  } else {
-    iconFit = NULL;
+    iconFit = std::make_unique<AnnotIconFit>(obj1.getDict());
   }
 
   obj1 = dict->lookup("TP");
@@ -1071,26 +1010,6 @@
   }
 }
 
-AnnotAppearanceCharacs::~AnnotAppearanceCharacs() {
-  if (borderColor)
-    delete borderColor;
-
-  if (backColor)
-    delete backColor;
-
-  if (normalCaption)
-    delete normalCaption;
-
-  if (rolloverCaption)
-    delete rolloverCaption;
-
-  if (alternateCaption)
-    delete alternateCaption;
-
-  if (iconFit)
-    delete iconFit;
-}
-
 //------------------------------------------------------------------------
 // AnnotAppearanceBBox
 //------------------------------------------------------------------------
@@ -1197,16 +1116,12 @@
   ok = gTrue;
   doc = docA;
   xref = doc->getXRef();
-  appearStreams = NULL;
-  appearBBox = NULL;
-  appearState = NULL;
-  appearBuf = NULL;
   fontSize = 0;
 
   appearance.setToNull();
 
   //----- parse the rectangle
-  rect = new PDFRectangle();
+  rect = std::make_unique<PDFRectangle>();
   obj1 = dict->lookup("Rect");
   if (obj1.isArray() && obj1.arrayGetLength() == 4) {
     Object obj2;
@@ -1235,9 +1150,9 @@
 
   obj1 = dict->lookup("Contents");
   if (obj1.isString()) {
-    contents = obj1.getString()->copy();
+    contents.reset(obj1.getString()->copy());
   } else {
-    contents = new GooString();
+    contents = std::make_unique<GooString>();
   }
 
   // Note: This value is overwritten by Annots ctor
@@ -1252,16 +1167,12 @@
 
   obj1 = dict->lookup("NM");
   if (obj1.isString()) {
-    name = obj1.getString()->copy();
-  } else {
-    name = NULL;
+    name.reset(obj1.getString()->copy());
   }
 
   obj1 = dict->lookup("M");
   if (obj1.isString()) {
-    modified = obj1.getString()->copy();
-  } else {
-    modified = NULL;
+    modified.reset(obj1.getString()->copy());
   }
 
   //----- get the flags
@@ -1275,13 +1186,13 @@
   //----- get the annotation appearance dictionary
   apObj = dict->lookup("AP");
   if (apObj.isDict()) {
-    appearStreams = new AnnotAppearance(doc, &apObj);
+    appearStreams = std::make_unique<AnnotAppearance>(doc, &apObj);
   }
 
   //----- get the appearance state
   asObj = dict->lookup("AS");
   if (asObj.isName()) {
-    appearState = new GooString(asObj.getName());
+    appearState = std::make_unique<GooString>(asObj.getName());
   } else if (appearStreams && appearStreams->getNumStates() != 0) {
     error (errSyntaxError, -1, "Invalid or missing AS value in annotation containing one or more appearance subdictionaries");
     // AS value is required in this case, but if the
@@ -1292,7 +1203,7 @@
     }
   }
   if (!appearState) {
-    appearState = new GooString("Off");
+    appearState = std::make_unique<GooString>("Off");
   }
 
   //----- get the annotation appearance
@@ -1306,16 +1217,13 @@
   // seems to ignore the Border entry for annots that can't have a BS entry. So, we only
   // follow this rule for annots tha can have a BS entry.
   obj1 = dict->lookup("Border");
-  if (obj1.isArray())
-    border = new AnnotBorderArray(obj1.getArray());
-  else
-    border = NULL;
+  if (obj1.isArray()) {
+    border = std::make_unique<AnnotBorderArray>(obj1.getArray());
+  }
 
   obj1 = dict->lookup("C");
   if (obj1.isArray()) {
-    color = new AnnotColor(obj1.getArray());
-  } else {
-    color = NULL;
+    color = std::make_unique<AnnotColor>(obj1.getArray());
   }
 
   obj1 = dict->lookup("StructParent");
@@ -1378,8 +1286,7 @@
   annotLocker();
   /* Set M to current time, unless we are updating M itself */
   if (strcmp(key, "M") != 0) {
-    delete modified;
-    modified = timeToDateString(NULL);
+    modified.reset(timeToDateString(nullptr));
 
     annotObj.dictSet("M", Object(modified->copy()));
   }
@@ -1391,17 +1298,16 @@
 
 void Annot::setContents(GooString *new_content) {
   annotLocker();
-  delete contents;
 
   if (new_content) {
-    contents = new GooString(new_content);
+    contents = std::make_unique<GooString>(new_content);
     //append the unicode marker <FE FF> if needed	
     if (!contents->hasUnicodeMarker()) {
       contents->insert(0, 0xff);
       contents->insert(0, 0xfe);
     }
   } else {
-    contents = new GooString();
+    contents = std::make_unique<GooString>();
   }
   
   update ("Contents", Object(contents->copy()));
@@ -1409,12 +1315,11 @@
 
 void Annot::setName(GooString *new_name) {
   annotLocker();
-  delete name;
 
   if (new_name) {
-    name = new GooString(new_name);
+    name = std::make_unique<GooString>(new_name);
   } else {
-    name = new GooString();
+    name = std::make_unique<GooString>();
   }
 
   update ("NM", Object(name->copy()));
@@ -1422,12 +1327,11 @@
 
 void Annot::setModified(GooString *new_modified) {
   annotLocker();
-  delete modified;
 
   if (new_modified)
-    modified = new GooString(new_modified);
+    modified = std::make_unique<GooString>(new_modified);
   else
-    modified = new GooString();
+    modified = std::make_unique<GooString>();
 
   update ("M", Object(modified->copy()));
 }
@@ -1438,30 +1342,28 @@
   update ("F", Object(int(flags)));
 }
 
-void Annot::setBorder(AnnotBorder *new_border) {
+void Annot::setBorder(std::unique_ptr<AnnotBorder> &&new_border) {
   annotLocker();
-  delete border;
 
   if (new_border) {
     Object obj1 = new_border->writeToObject(xref);
     update(new_border->getType() == AnnotBorder::typeArray ? "Border" : "BS", std::move(obj1));
-    border = new_border;
+    border = std::move(new_border);
   } else {
-    border = NULL;
+    border = nullptr;
   }
   invalidateAppearance();
 }
 
-void Annot::setColor(AnnotColor *new_color) {
+void Annot::setColor(std::unique_ptr<AnnotColor> &&new_color) {
   annotLocker();
-  delete color;
 
   if (new_color) {
     Object obj1 = new_color->writeToObject(xref);
     update ("C", std::move(obj1));
-    color = new_color;
+    color = std::move(new_color);
   } else {
-    color = NULL;
+    color = nullptr;
   }
   invalidateAppearance();
 }
@@ -1489,11 +1391,8 @@
   if (!state)
     return;
 
-  delete appearState;
-  appearState = new GooString(state);
-
-  delete appearBBox;
-  appearBBox = NULL;
+  appearState = std::make_unique<GooString>(state);
+  appearBBox = nullptr;
 
   update ("AS", Object(objName, state));
 
@@ -1510,15 +1409,9 @@
   if (appearStreams) { // Remove existing appearance streams
     appearStreams->removeAllStreams();
   }
-  delete appearStreams;
-  appearStreams = NULL;
-
-  delete appearState;
-  appearState = NULL;
-
-  delete appearBBox;
-  appearBBox = NULL;
-
+  appearStreams = nullptr;
+  appearState = nullptr;
+  appearBBox = nullptr;
   appearance.setToNull();
 
   Object obj2 = annotObj.dictLookup("AP");
@@ -1583,27 +1476,6 @@
 }
 
 Annot::~Annot() {
-  delete rect;
-  delete contents;
-
-  if (name)
-    delete name;
-
-  if (modified)
-    delete modified;
-
-  delete appearStreams;
-  delete appearBBox;
-
-  if (appearState)
-    delete appearState;
-
-  if (border)
-    delete border;
-
-  if (color)
-    delete color;
-
 #if MULTITHREADED
     gDestroyMutex(&mutex);
 #endif
@@ -1827,7 +1699,7 @@
 
   // draw the appearance stream
   Object obj = appearance.fetch(gfx->getXRef());
-  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(),
       rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
 }
 
@@ -1895,36 +1767,18 @@
   initialize(docA, dictObject->getDict(), obj);
 }
 
-AnnotMarkup::~AnnotMarkup() {
-  if (label)
-    delete label;
-
-  if (popup)
-    delete popup;
-
-  if (date)
-    delete date;
-
-  if (subject)
-    delete subject;
-}
-
 void AnnotMarkup::initialize(PDFDoc *docA, Dict *dict, Object *obj) {
   Object obj1, obj2;
 
   obj1 = dict->lookup("T");
   if (obj1.isString()) {
-    label = obj1.getString()->copy();
-  } else {
-    label = NULL;
+    label.reset(obj1.getString()->copy());
   }
 
   obj1 = dict->lookup("Popup");
   obj2 = dict->lookupNF("Popup");
   if (obj1.isDict() && obj2.isRef()) {
-    popup = new AnnotPopup(docA, &obj1, &obj2);
-  } else {
-    popup = NULL;
+    popup = std::make_unique<AnnotPopup>(docA, &obj1, &obj2);
   }
 
   obj1 = dict->lookup("CA");
@@ -1936,9 +1790,7 @@
 
   obj1 = dict->lookup("CreationDate");
   if (obj1.isString()) {
-    date = obj1.getString()->copy();
-  } else {
-    date = NULL;
+    date.reset(obj1.getString()->copy());
   }
 
   obj1 = dict->lookupNF("IRT");
@@ -1951,9 +1803,7 @@
 
   obj1 = dict->lookup("Subj");
   if (obj1.isString()) {
-    subject = obj1.getString()->copy();
-  } else {
-    subject = NULL;
+    subject.reset(obj1.getString()->copy());
   }
 
   obj1 = dict->lookup("RT");
@@ -1980,41 +1830,38 @@
 }
 
 void AnnotMarkup::setLabel(GooString *new_label) {
-  delete label;
-
   if (new_label) {
-    label = new GooString(new_label);
+    label = std::make_unique<GooString>(new_label);
     //append the unicode marker <FE FF> if needed
     if (!label->hasUnicodeMarker()) {
       label->insert(0, 0xff);
       label->insert(0, 0xfe);
     }
   } else {
-    label = new GooString();
+    label = std::make_unique<GooString>();
   }
 
   update ("T", Object(label->copy()));
 }
 
-void AnnotMarkup::setPopup(AnnotPopup *new_popup) {
+void AnnotMarkup::setPopup(std::unique_ptr<AnnotPopup> &&new_popup) {
   // If there exists an old popup annotation that is already
   // associated with a page, then we need to remove that
   // popup annotation from the page. Otherwise we would have
   // dangling references to it.
-  if (popup != NULL && popup->getPageNum() != 0) {
+  if (popup && popup->getPageNum() != 0) {
     Page *pageobj = doc->getPage(popup->getPageNum());
     if (pageobj) {
-      pageobj->removeAnnot(popup);
+      pageobj->removeAnnot(popup.get());
     }
   }
-  delete popup;
 
   if (new_popup) {
     const Ref popupRef = new_popup->getRef();
     update ("Popup", Object(popupRef.num, popupRef.gen));
 
     new_popup->setParent(this);
-    popup = new_popup;
+    popup = std::move(new_popup);
 
     // If this annotation is already added to a page, then we
     // add the new popup annotation to the same page.
@@ -2022,10 +1869,10 @@
       Page *pageobj = doc->getPage(page);
       assert(pageobj != NULL); // pageobj should exist in doc (see setPage())
 
-      pageobj->addAnnot(popup);
+      pageobj->addAnnot(popup.get());
     }
   } else {
-    popup = NULL;
+    popup = nullptr;
   }
 }
 
@@ -2036,12 +1883,10 @@
 }
 
 void AnnotMarkup::setDate(GooString *new_date) {
-  delete date;
-
   if (new_date)
-    date = new GooString(new_date);
+    date = std::make_unique<GooString>(new_date);
   else
-    date = new GooString();
+    date = std::make_unique<GooString>();
 
   update ("CreationDate", Object(date->copy()));
 }
@@ -2052,7 +1897,7 @@
 
   // Remove popup
   if (popup) {
-    pageobj->removeAnnot(popup);
+    pageobj->removeAnnot(popup.get());
   }
 
   Annot::removeReferencedObjects();
@@ -2079,10 +1924,6 @@
   initialize (docA, dictObject->getDict());
 }
 
-AnnotText::~AnnotText() {
-  delete icon;
-}
-
 void AnnotText::initialize(PDFDoc *docA, Dict *dict) {
   Object obj1;
 
@@ -2094,9 +1935,9 @@
 
   obj1 = dict->lookup("Name");
   if (obj1.isName()) {
-    icon = new GooString(obj1.getName());
+    icon = std::make_unique<GooString>(obj1.getName());
   } else {
-    icon = new GooString("Note");
+    icon = std::make_unique<GooString>("Note");
   }
 
   obj1 = dict->lookup("StateModel");
@@ -2174,12 +2015,10 @@
   if (new_icon && icon->cmp(new_icon) == 0)
     return;
 
-  delete icon;
-
   if (new_icon) {
-    icon = new GooString (new_icon);
+    icon = std::make_unique<GooString>(new_icon);
   } else {
-    icon = new GooString("Note");
+    icon = std::make_unique<GooString>("Note");
   }
 
   update("Name", Object(objName, icon->getCString()));
@@ -2440,11 +2279,11 @@
   if (appearance.isNull()) {
     ca = opacity;
 
-    appearBuf = new GooString ();
+    appearBuf = std::make_unique<GooString>();
 
     appearBuf->append ("q\n");
     if (color)
-      setColor(color, gTrue);
+      setColor(color.get(), gTrue);
     else
       appearBuf->append ("1 1 1 rg\n");
     if (!icon->cmp("Note"))
@@ -2469,31 +2308,29 @@
 
     // Force 24x24 rectangle
     PDFRectangle fixedRect(rect->x1, rect->y2 - 24, rect->x1 + 24, rect->y2);
-    appearBBox = new AnnotAppearanceBBox(&fixedRect);
+    appearBBox = std::make_unique<AnnotAppearanceBBox>(&fixedRect);
     double bbox[4];
     appearBBox->getBBoxRect(bbox);
     if (ca == 1) {
       appearance = createForm(bbox, gFalse, nullptr);
     } else {
       Object aStream = createForm(bbox, gTrue, nullptr);
-      delete appearBuf;
-
-      appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
+      appearBuf = std::make_unique<GooString>("/GS0 gs\n/Fm0 Do");
       Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL);
       appearance = createForm(bbox, gFalse, resDict);
     }
-    delete appearBuf;
+    appearBuf = nullptr;
   }
 
   // draw the appearance stream
   Object obj = appearance.fetch(gfx->getXRef());
   if (appearBBox) {
-    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(),
                    appearBBox->getPageXMin(), appearBBox->getPageYMin(),
                    appearBBox->getPageXMax(), appearBBox->getPageYMax(),
                    getRotation());
   } else {
-    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(),
                    rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
   }
 }
@@ -2517,30 +2354,18 @@
   initialize (docA, dictObject->getDict());
 }
 
-AnnotLink::~AnnotLink() {
-  delete action;
-  /*
-  if (uriAction)
-    delete uriAction;
-  */
-  if (quadrilaterals)
-    delete quadrilaterals;
-}
-
 void AnnotLink::initialize(PDFDoc *docA, Dict *dict) {
   Object obj1;
 
-  action = NULL;
-
   // look for destination
   obj1 = dict->lookup("Dest");
   if (!obj1.isNull()) {
-    action = LinkAction::parseDest(&obj1);
+    action.reset(LinkAction::parseDest(&obj1));
   // look for action
   } else {
     obj1 = dict->lookup("A");
     if (obj1.isDict()) {
-      action = LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI());
+      action.reset(LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI()));
     }
   }
 
@@ -2573,17 +2398,14 @@
   */
   obj1 = dict->lookup("QuadPoints");
   if (obj1.isArray()) {
-    quadrilaterals = new AnnotQuadrilaterals(obj1.getArray(), rect);
-  } else {
-    quadrilaterals = NULL;
+    quadrilaterals = std::make_unique<AnnotQuadrilaterals>(obj1.getArray(), rect.get());
   }
 
   obj1 = dict->lookup("BS");
   if (obj1.isDict()) {
-    delete border;
-    border = new AnnotBorderBS(obj1.getDict());
+    border = std::make_unique<AnnotBorderBS>(obj1.getDict());
   } else if (!border) {
-    border = new AnnotBorderBS();
+    border = std::make_unique<AnnotBorderBS>();
   }
 }
 
@@ -2594,7 +2416,7 @@
   annotLocker();
   // draw the appearance stream
   Object obj = appearance.fetch(gfx->getXRef());
-  gfx->drawAnnot(&obj, border, color,
+  gfx->drawAnnot(&obj, border.get(), color.get(),
 		 rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
 }
 
@@ -2619,30 +2441,14 @@
   initialize(docA, dictObject->getDict());
 }
 
-AnnotFreeText::~AnnotFreeText() {
-  delete appearanceString;
-
-  if (styleString)
-    delete styleString;
-
-  if (calloutLine)
-    delete calloutLine;
-
-  if (borderEffect)
-    delete borderEffect;
-
-  if (rectangle)
-    delete rectangle;
-}
-
 void AnnotFreeText::initialize(PDFDoc *docA, Dict *dict) {
   Object obj1;
 
   obj1 = dict->lookup("DA");
   if (obj1.isString()) {
-    appearanceString = obj1.getString()->copy();
+    appearanceString.reset(obj1.getString()->copy());
   } else {
-    appearanceString = new GooString();
+    appearanceString = std::make_unique<GooString>();
     error(errSyntaxError, -1, "Bad appearance for annotation");
     ok = gFalse;
   }
@@ -2656,9 +2462,7 @@
 
   obj1 = dict->lookup("DS");
   if (obj1.isString()) {
-    styleString = obj1.getString()->copy();
-  } else {
-    styleString = NULL;
+    styleString.reset(obj1.getString()->copy());
   }
 
   obj1 = dict->lookup("CL");
@@ -2675,12 +2479,10 @@
       double x3, y3;
       (obj2 = obj1.arrayGet(4), obj2.isNum() ? x3 = obj2.getNum() : x3 = 0);
       (obj2 = obj1.arrayGet(5), obj2.isNum() ? y3 = obj2.getNum() : y3 = 0);
-      calloutLine = new AnnotCalloutMultiLine(x1, y1, x2, y2, x3, y3);
+      calloutLine = std::make_unique<AnnotCalloutMultiLine>(x1, y1, x2, y2, x3, y3);
     } else {
-      calloutLine = new AnnotCalloutLine(x1, y1, x2, y2);
+      calloutLine = std::make_unique<AnnotCalloutLine>(x1, y1, x2, y2);
     }
-  } else {
-    calloutLine = NULL;
   }
 
   obj1 = dict->lookup("IT");
@@ -2702,24 +2504,19 @@
 
   obj1 = dict->lookup("BS");
   if (obj1.isDict()) {
-    delete border;
-    border = new AnnotBorderBS(obj1.getDict());
+    border = std::make_unique<AnnotBorderBS>(obj1.getDict());
   } else if (!border) {
-    border = new AnnotBorderBS();
+    border = std::make_unique<AnnotBorderBS>();
   }
 
   obj1 = dict->lookup("BE");
   if (obj1.isDict()) {
-    borderEffect = new AnnotBorderEffect(obj1.getDict());
-  } else {
-    borderEffect = NULL;
+    borderEffect = std::make_unique<AnnotBorderEffect>(obj1.getDict());
   }
 
   obj1 = dict->lookup("RD");
   if (obj1.isArray()) {
-    rectangle = parseDiffRectangle(obj1.getArray(), rect);
-  } else {
-    rectangle = NULL;
+    rectangle = parseDiffRectangle(obj1.getArray(), rect.get());
   }
 
   obj1 = dict->lookup("LE");
@@ -2737,12 +2534,10 @@
 }
 
 void AnnotFreeText::setAppearanceString(GooString *new_string) {
-  delete appearanceString;
-
   if (new_string) {
-    appearanceString = new GooString(new_string);
+    appearanceString = std::make_unique<GooString>(new_string);
   } else {
-    appearanceString = new GooString();
+    appearanceString = std::make_unique<GooString>();
   }
 
   update ("DA", Object(appearanceString->copy()));
@@ -2757,29 +2552,25 @@
 }
 
 void AnnotFreeText::setStyleString(GooString *new_string) {
-  delete styleString;
-
   if (new_string) {
-    styleString = new GooString(new_string);
+    styleString = std::make_unique<GooString>(new_string);
     //append the unicode marker <FE FF> if needed
     if (!styleString->hasUnicodeMarker()) {
       styleString->insert(0, 0xff);
       styleString->insert(0, 0xfe);
     }
   } else {
-    styleString = new GooString();
+    styleString = std::make_unique<GooString>();
   }
 
   update ("DS", Object(styleString->copy()));
 }
 
 void AnnotFreeText::setCalloutLine(AnnotCalloutLine *line) {
-  delete calloutLine;
-
   Object obj1;
   if (line == NULL) {
     obj1.setToNull();
-    calloutLine = NULL;
+    calloutLine = nullptr;
   } else {
     double x1 = line->getX1(), y1 = line->getY1();
     double x2 = line->getX2(), y2 = line->getY2();
@@ -2794,9 +2585,9 @@
       double x3 = mline->getX3(), y3 = mline->getY3();
       obj1.arrayAdd( Object(x3) );
       obj1.arrayAdd( Object(y3) );
-      calloutLine = new AnnotCalloutMultiLine(x1, y1, x2, y2, x3, y3);
+      calloutLine = std::make_unique<AnnotCalloutMultiLine>(x1, y1, x2, y2, x3, y3);
     } else {
-      calloutLine = new AnnotCalloutLine(x1, y1, x2, y2);
+      calloutLine = std::make_unique<AnnotCalloutLine>(x1, y1, x2, y2);
     }
   }
 
@@ -2834,9 +2625,9 @@
   return GfxFont::makeFont(xref, "AnnotDrawFont", dummyRef, fontDict);
 }
 
-void AnnotFreeText::parseAppearanceString(GooString *da, double &fontsize, AnnotColor* &fontcolor) {
+void AnnotFreeText::parseAppearanceString(GooString *da, double &fontsize, std::unique_ptr<AnnotColor> &fontcolor) {
   fontsize = -1;
-  fontcolor = NULL;
+
   if (da) {
     GooList * daToks = new GooList();
     int j, i = 0;
@@ -2862,18 +2653,18 @@
             fontsize = gatof(( (GooString *)daToks->get(i-1) )->getCString());
         }
       }
-      if (fontcolor == NULL) {
+      if (!fontcolor) {
         if (!((GooString *)daToks->get(i))->cmp("g") && i >= 1) {
-          fontcolor = new AnnotColor(gatof(( (GooString *)daToks->get(i-1) )->getCString()));
+          fontcolor = std::make_unique<AnnotColor>(gatof(( (GooString *)daToks->get(i-1) )->getCString()));
         } else if (!((GooString *)daToks->get(i))->cmp("rg") && i >= 3) {
-          fontcolor = new AnnotColor(gatof(( (GooString *)daToks->get(i-3) )->getCString()),
-                                     gatof(( (GooString *)daToks->get(i-2) )->getCString()),
-                                     gatof(( (GooString *)daToks->get(i-1) )->getCString()));
+          fontcolor = std::make_unique<AnnotColor>(gatof(( (GooString *)daToks->get(i-3) )->getCString()),
+                                                   gatof(( (GooString *)daToks->get(i-2) )->getCString()),
+                                                   gatof(( (GooString *)daToks->get(i-1) )->getCString()));
         } else if (!((GooString *)daToks->get(i))->cmp("k") && i >= 4) {
-          fontcolor = new AnnotColor(gatof(( (GooString *)daToks->get(i-4) )->getCString()),
-                                     gatof(( (GooString *)daToks->get(i-3) )->getCString()),
-                                     gatof(( (GooString *)daToks->get(i-2) )->getCString()),
-                                     gatof(( (GooString *)daToks->get(i-1) )->getCString()));
+          fontcolor = std::make_unique<AnnotColor>(gatof(( (GooString *)daToks->get(i-4) )->getCString()),
+                                                   gatof(( (GooString *)daToks->get(i-3) )->getCString()),
+                                                   gatof(( (GooString *)daToks->get(i-2) )->getCString()),
+                                                   gatof(( (GooString *)daToks->get(i-1) )->getCString()));
         }
       }
     }
@@ -2885,12 +2676,12 @@
 {
   double borderWidth, ca = opacity;
 
-  appearBuf = new GooString ();
+  appearBuf = std::make_unique<GooString>();
   appearBuf->append ("q\n");
 
   borderWidth = border->getWidth();
   if (borderWidth > 0)
-    setLineStyleForBorder(border);
+    setLineStyleForBorder(border.get());
 
   // Box size
   const double width = rect->x2 - rect->x1;
@@ -2898,26 +2689,26 @@
 
   // Parse some properties from the appearance string
   double fontsize;
-  AnnotColor *fontcolor;
-  parseAppearanceString(appearanceString, fontsize, fontcolor);
+  std::unique_ptr<AnnotColor> fontcolor;
+  parseAppearanceString(appearanceString.get(), fontsize, fontcolor);
   // Default values
   if (fontsize <= 0)
     fontsize = 10;
-  if (fontcolor == NULL)
-    fontcolor = new AnnotColor(0, 0, 0); // Black
+  if (!fontcolor)
+    fontcolor = std::make_unique<AnnotColor>(0, 0, 0); // Black
   if (!contents)
-    contents = new GooString ();
+    contents = std::make_unique<GooString>();
 
   // Draw box
   GBool doFill = (color && color->getSpace() != AnnotColor::colorTransparent);
   GBool doStroke = (borderWidth != 0);
   if (doFill || doStroke) {
     if (doStroke) {
-      setColor(fontcolor, gFalse); // Border color: same as font color
+      setColor(fontcolor.get(), gFalse); // Border color: same as font color
     }
     appearBuf->appendf ("{0:.2f} {0:.2f} {1:.2f} {2:.2f} re\n", borderWidth/2, width-borderWidth, height-borderWidth);
     if (doFill) {
-      setColor(color, gTrue);
+      setColor(color.get(), gTrue);
       appearBuf->append(doStroke ? "B\n" : "f\n");
     } else {
       appearBuf->append("S\n");
@@ -2933,7 +2724,7 @@
   GfxFont *font = createAnnotDrawFont(xref, fontResDict);
 
   // Set font state
-  setColor(fontcolor, gTrue);
+  setColor(fontcolor.get(), gTrue);
   appearBuf->appendf ("BT 1 0 0 1 {0:.2f} {1:.2f} Tm\n", textmargin, height - textmargin - fontsize * font->getDescent());
   appearBuf->appendf ("/AnnotDrawFont {0:.2f} Tf\n", fontsize);
 
@@ -2942,7 +2733,7 @@
   while (i < contents->getLength()) {
     GooString out;
     double linewidth, xpos;
-    layoutText(contents, &out, &i, font, &linewidth, textwidth/fontsize, NULL, gFalse);
+    layoutText(contents.get(), &out, &i, font, &linewidth, textwidth/fontsize, NULL, gFalse);
     linewidth *= fontsize;
     switch (quadding) {
     case quaddingCentered:
@@ -2956,13 +2747,13 @@
       break;
     }
     appearBuf->appendf("{0:.2f} {1:.2f} Td\n", xpos - xposPrev, -fontsize);
-    writeString(&out, appearBuf);
+    writeString(&out, appearBuf.get());
     appearBuf->append("Tj\n");
     xposPrev = xpos;
   }
 
   font->decRefCnt();
-  delete fontcolor;
+  fontcolor = nullptr;
   appearBuf->append ("ET Q\n");
 
   double bbox[4];
@@ -2974,13 +2765,11 @@
     appearance = createForm(bbox, gFalse, fontResDict);
   } else {
     Object aStream = createForm(bbox, gTrue, fontResDict);
-    delete appearBuf;
-
-    appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
+    appearBuf = std::make_unique<GooString>("/GS0 gs\n/Fm0 Do");
     Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL);
     appearance = createForm(bbox, gFalse, resDict);
   }
-  delete appearBuf;
+  appearBuf = nullptr;
 }
 
 void AnnotFreeText::draw(Gfx *gfx, GBool printing) {
@@ -2994,7 +2783,7 @@
 
   // draw the appearance stream
   Object obj = appearance.fetch(gfx->getXRef());
-  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(),
                  rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
 }
 
@@ -3027,17 +2816,6 @@
   initialize(docA, dictObject->getDict());
 }
 
-AnnotLine::~AnnotLine() {
-  delete coord1;
-  delete coord2;
-
-  if (interiorColor)
-    delete interiorColor;
-
-  if (measure)
-    delete measure;
-}
-
 void AnnotLine::initialize(PDFDoc *docA, Dict *dict) {
   Object obj1;
 
@@ -3051,11 +2829,11 @@
     (obj2 = obj1.arrayGet(2), obj2.isNum() ? x2 = obj2.getNum() : x2 = 0);
     (obj2 = obj1.arrayGet(3), obj2.isNum() ? y2 = obj2.getNum() : y2 = 0);
 
-    coord1 = new AnnotCoord(x1, y1);
-    coord2 = new AnnotCoord(x2, y2);
+    coord1 = std::make_unique<AnnotCoord>(x1, y1);
+    coord2 = std::make_unique<AnnotCoord>(x2, y2);
   } else {
-    coord1 = new AnnotCoord();
-    coord2 = new AnnotCoord();
+    coord1 = std::make_unique<AnnotCoord>();
+    coord2 = std::make_unique<AnnotCoord>();
   }
 
   obj1 = dict->lookup("LE");
@@ -3080,9 +2858,7 @@
 
   obj1 = dict->lookup("IC");
   if (obj1.isArray()) {
-    interiorColor = new AnnotColor(obj1.getArray());
-  } else {
-    interiorColor = NULL;
+    interiorColor = std::make_unique<AnnotColor>(obj1.getArray());
   }
 
   obj1 = dict->lookup("LL");
@@ -3170,10 +2946,9 @@
 
   obj1 = dict->lookup("BS");
   if (obj1.isDict()) {
-    delete border;
-    border = new AnnotBorderBS(obj1.getDict());
+    border = std::make_unique<AnnotBorderBS>(obj1.getDict());
   } else if (!border) {
-    border = new AnnotBorderBS();
+    border = std::make_unique<AnnotBorderBS>();
   }
 }
 
@@ -3184,10 +2959,8 @@
 }
 
 void AnnotLine::setVertices(double x1, double y1, double x2, double y2) {
-  delete coord1;
-  coord1 = new AnnotCoord(x1, y1);
-  delete coord2;
-  coord2 = new AnnotCoord(x2, y2);
+  coord1 = std::make_unique<AnnotCoord>(x1, y1);
+  coord2 = std::make_unique<AnnotCoord>(x2, y2);
 
   Array *lArray = new Array(xref);
   lArray->add( Object(x1) );
@@ -3211,15 +2984,13 @@
   invalidateAppearance();
 }
 
-void AnnotLine::setInteriorColor(AnnotColor *new_color) {
-  delete interiorColor;
-
+void AnnotLine::setInteriorColor(std::unique_ptr<AnnotColor> &&new_color) {
   if (new_color) {
     Object obj1 = new_color->writeToObject(xref);
     update ("IC", std::move(obj1));
-    interiorColor = new_color;
+    interiorColor = std::move(new_color);
   } else {
-    interiorColor = NULL;
+    interiorColor = nullptr;
   }
   invalidateAppearance();
 }
@@ -3260,14 +3031,14 @@
 {
   double borderWidth, ca = opacity;
 
-  appearBBox = new AnnotAppearanceBBox(rect);
-  appearBuf = new GooString ();
+  appearBBox = std::make_unique<AnnotAppearanceBBox>(rect.get());
+  appearBuf = std::make_unique<GooString>();
   appearBuf->append ("q\n");
   if (color) {
-    setColor(color, gFalse);
+    setColor(color.get(), gFalse);
   }
 
-  setLineStyleForBorder(border);
+  setLineStyleForBorder(border.get());
   borderWidth = border->getWidth();
   appearBBox->setBorderWidth(std::max(1., borderWidth));
 
@@ -3306,7 +3077,7 @@
     while (i < contents->getLength()) {
       GooString out;
       double linewidth;
-      layoutText(contents, &out, &i, font, &linewidth, 0, NULL, gFalse);
+      layoutText(contents.get(), &out, &i, font, &linewidth, 0, NULL, gFalse);
       linewidth *= fontsize;
       if (linewidth > captionwidth) {
         captionwidth = linewidth;
@@ -3375,11 +3146,11 @@
     while (i < contents->getLength()) {
       GooString out;
       double linewidth, xpos;
-      layoutText(contents, &out, &i, font, &linewidth, 0, NULL, gFalse);
+      layoutText(contents.get(), &out, &i, font, &linewidth, 0, NULL, gFalse);
       linewidth *= fontsize;
       xpos = (captionwidth - linewidth) / 2;
       appearBuf->appendf("{0:.2f} {1:.2f} Td\n", xpos - xposPrev, -fontsize);
-      writeString(&out, appearBuf);
+      writeString(&out, appearBuf.get());
       appearBuf->append ("Tj\n");
       xposPrev = xpos;
     }
@@ -3414,13 +3185,11 @@
     appearance = createForm(bbox, gFalse, fontResDict);
   } else {
     Object aStream = createForm(bbox, gTrue, fontResDict);
-    delete appearBuf;
-
-    appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
+    appearBuf = std::make_unique<GooString>("/GS0 gs\n/Fm0 Do");
     Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL);
     appearance = createForm(bbox, gFalse, resDict);
   }
-  delete appearBuf;
+  appearBuf = nullptr;
 }
 
 void AnnotLine::draw(Gfx *gfx, GBool printing) {
@@ -3435,12 +3204,12 @@
   // draw the appearance stream
   Object obj = appearance.fetch(gfx->getXRef());
   if (appearBBox) {
-    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(),
                    appearBBox->getPageXMin(), appearBBox->getPageYMin(),
                    appearBBox->getPageXMax(), appearBBox->getPageYMax(),
                    getRotation());
   } else {
-    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(),
                    rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
   }
 }
@@ -3514,18 +3283,13 @@
 
   obj1 = dict->lookup("QuadPoints");
   if (obj1.isArray()) {
-    quadrilaterals = new AnnotQuadrilaterals(obj1.getArray(), rect);
+    quadrilaterals = std::make_unique<AnnotQuadrilaterals>(obj1.getArray(), rect.get());
   } else {
     error(errSyntaxError, -1, "Bad Annot Text Markup QuadPoints");
-    quadrilaterals = NULL;
     ok = gFalse;
   }
 }
 
-AnnotTextMarkup::~AnnotTextMarkup() {
-  delete quadrilaterals;
-}
-
 void AnnotTextMarkup::setType(AnnotSubtype new_type) {
   const char *typeName;
 
@@ -3565,8 +3329,7 @@
     a->add(Object(quadPoints->getY4(i)));
   }
 
-  delete quadrilaterals;
-  quadrilaterals = new AnnotQuadrilaterals(a, rect);
+  quadrilaterals = std::make_unique<AnnotQuadrilaterals>(a, rect.get());
 
   annotObj.dictSet ("QuadPoints", Object(a));
   invalidateAppearance();
@@ -3584,12 +3347,11 @@
     GBool blendMultiply = gTrue;
     ca = opacity;
 
-    appearBuf = new GooString ();
+    appearBuf = std::make_unique<GooString>();
     appearBuf->append ("q\n");
 
     /* Adjust BBox */
-    delete appearBBox;
-    appearBBox = new AnnotAppearanceBBox(rect);
+    appearBBox = std::make_unique<AnnotAppearanceBBox>(rect.get());
     for (i = 0; i < quadrilaterals->getQuadrilateralsLength(); ++i) {
       appearBBox->extendTo (quadrilaterals->getX1(i) - rect->x1, quadrilaterals->getY1(i) - rect->y1);
       appearBBox->extendTo (quadrilaterals->getX2(i) - rect->x1, quadrilaterals->getY2(i) - rect->y1);
@@ -3600,7 +3362,7 @@
     switch (type) {
     case typeUnderline:
       if (color) {
-        setColor(color, gFalse);
+        setColor(color.get(), gFalse);
       }
       appearBuf->append ("[] 0 d 1 w\n");
 
@@ -3619,7 +3381,7 @@
       break;
     case typeStrikeOut:
       if (color) {
-        setColor(color, gFalse);
+        setColor(color.get(), gFalse);
       }
       blendMultiply = gFalse;
       appearBuf->append ("[] 0 d 1 w\n");
@@ -3645,7 +3407,7 @@
       break;
     case typeSquiggly:
       if (color) {
-        setColor(color, gFalse);
+        setColor(color.get(), gFalse);
       }
       appearBuf->append ("[] 0 d 1 w\n");
 
@@ -3672,7 +3434,7 @@
     default:
     case typeHighlight:
       if (color)
-        setColor(color, gTrue);
+        setColor(color.get(), gTrue);
 
       double biggestBorder = 0;
       for (i = 0; i < quadrilaterals->getQuadrilateralsLength(); ++i) {
@@ -3713,32 +3475,28 @@
     bbox[2] = appearBBox->getPageXMax();
     bbox[3] = appearBBox->getPageYMax();
     aStream = createForm(bbox, gTrue, NULL);
-    delete appearBuf;
-
-    appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
+    appearBuf = std::make_unique<GooString>("/GS0 gs\n/Fm0 Do");
     Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", 1, blendMultiply ? "Multiply" : NULL);
     if (ca == 1) {
       appearance = createForm(bbox, gFalse, resDict);
     } else {
       aStream = createForm(bbox, gTrue, resDict);
-      delete appearBuf;
-
-      appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
+      appearBuf = std::make_unique<GooString>("/GS0 gs\n/Fm0 Do");
       Dict *resDict2 = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL);
       appearance = createForm(bbox, gFalse, resDict2);
     }
-    delete appearBuf;
+    appearBuf = nullptr;
   }
 
   // draw the appearance stream
   Object obj = appearance.fetch(gfx->getXRef());
   if (appearBBox) {
-    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(),
                    appearBBox->getPageXMin(), appearBBox->getPageYMin(),
                    appearBBox->getPageXMax(), appearBBox->getPageYMax(),
                    getRotation());
   } else {
-    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(),
                    rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
   }
 }
@@ -3761,17 +3519,6 @@
   initialize(docA, dictObject->getDict());
 }
 
-AnnotWidget::~AnnotWidget() {
-  if (appearCharacs)
-    delete appearCharacs;
-  
-  if (action)
-    delete action;
-
-  if (parent)
-    delete parent;
-}
-
 void AnnotWidget::initialize(PDFDoc *docA, Dict *dict) {
   Object obj1;
 
@@ -3796,15 +3543,12 @@
 
   obj1 = dict->lookup("MK");
   if (obj1.isDict()) {
-    appearCharacs = new AnnotAppearanceCharacs(obj1.getDict());
-  } else {
-    appearCharacs = NULL;
+    appearCharacs = std::make_unique<AnnotAppearanceCharacs>(obj1.getDict());
   }
 
-  action = NULL;
   obj1 = dict->lookup("A");
   if (obj1.isDict()) {
-    action = LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI());
+    action.reset(LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI()));
   }
 
   additionalActions = dict->lookupNF("AA");
@@ -3818,8 +3562,7 @@
 
   obj1 = dict->lookup("BS");
   if (obj1.isDict()) {
-    delete border;
-    border = new AnnotBorderBS(obj1.getDict());
+    border = std::make_unique<AnnotBorderBS>(obj1.getDict());
   }
 
   updatedAppearanceStream.num = updatedAppearanceStream.gen = -1;
@@ -4083,7 +3826,8 @@
     GBool txField, GBool forceZapfDingbats,
     GBool password) {
   GooList *daToks;
-  GooString *tok, *convertedText;
+  GooString *tok;
+  GooString convertedText;
   GfxFont *font;
   double dx, dy;
   double fontSize, fontSize2, borderWidth, x, xPrev, y, w, wMax;
@@ -4188,8 +3932,6 @@
     freeText = gTrue;
   }
 
-  convertedText = new GooString;
-
   // setup
   if (txField) {
     appearBuf->append("/Tx BMC\n");
@@ -4231,7 +3973,7 @@
         y = dy - 3;
         i = 0;
         while (i < text->getLength()) {
-          layoutText(text, convertedText, &i, font, &w, wMax / fontSize, NULL,
+          layoutText(text, &convertedText, &i, font, &w, wMax / fontSize, NULL,
                      forceZapfDingbats);
           y -= fontSize;
         }
@@ -4278,7 +4020,7 @@
     i = 0;
     xPrev = 0;
     while (i < text->getLength()) {
-      layoutText(text, convertedText, &i, font, &w, wMax / fontSize, NULL,
+      layoutText(text, &convertedText, &i, font, &w, wMax / fontSize, NULL,
                  forceZapfDingbats);
       w *= fontSize;
 
@@ -4298,7 +4040,7 @@
 
       // draw the line
       appearBuf->appendf("{0:.2f} {1:.2f} Td\n", x - xPrev, -fontSize);
-      writeString(convertedText, appearBuf);
+      writeString(&convertedText, appearBuf.get());
       appearBuf->append(" Tj\n");
 
       // next line
@@ -4331,7 +4073,7 @@
       }
 
       i = 0;
-      layoutText(text, convertedText, &i, font, NULL, 0.0, &charCount,
+      layoutText(text, &convertedText, &i, font, NULL, 0.0, &charCount,
                  forceZapfDingbats);
       if (charCount > comb)
         charCount = comb;
@@ -4374,8 +4116,8 @@
       }
 
       // write the text string
-      char *s = convertedText->getCString();
-      int len = convertedText->getLength();
+      char *s = convertedText.getCString();
+      int len = convertedText.getLength();
       i = 0;
       xPrev = w;                // so that first character is placed properly
       while (i < comb && len > 0) {
@@ -4394,10 +4136,9 @@
         x = 0.5 * (w - dx);
         appearBuf->appendf("{0:.2f} 0 Td\n", x - xPrev + w);
 
-        GooString *charBuf = new GooString(s, n);
-        writeString(charBuf, appearBuf);
+        GooString charBuf(s, n);
+        writeString(&charBuf, appearBuf.get());
         appearBuf->append(" Tj\n");
-        delete charBuf;
 
         i++;
         s += n;
@@ -4408,7 +4149,7 @@
       // regular (non-comb) formatting
     } else {
       i = 0;
-      layoutText(text, convertedText, &i, font, &w, 0.0, NULL,
+      layoutText(text, &convertedText, &i, font, &w, 0.0, NULL,
                  forceZapfDingbats);
 
       // compute font autosize
@@ -4465,7 +4206,7 @@
       }
 
       // write the text string
-      writeString(convertedText, appearBuf);
+      writeString(&convertedText, appearBuf.get());
       appearBuf->append(" Tj\n");
     }
   }
@@ -4481,7 +4222,6 @@
   if (freeText) {
     delete text;
   }
-  delete convertedText;
   if (freeFont) {
     font->decRefCnt();
   }
@@ -4491,7 +4231,8 @@
 void AnnotWidget::drawListBox(FormFieldChoice *fieldChoice,
 			      GooString *da, GfxResources *resources, int quadding) {
   GooList *daToks;
-  GooString *tok, *convertedText;
+  GooString *tok;
+  GooString convertedText;
   GfxFont *font;
   double fontSize, fontSize2, borderWidth, x, y, w, wMax;
   int tfPos, tmPos, i, j;
@@ -4552,8 +4293,6 @@
     return;
   }
 
-  convertedText = new GooString;
-
   // get the border width
   borderWidth = border ? border->getWidth() : 0;
 
@@ -4567,10 +4306,9 @@
         if (daToks) {
           deleteGooList(daToks, GooString);
         }
-        delete convertedText;
         return;
       }
-      layoutText(fieldChoice->getChoice(i), convertedText, &j, font, &w, 0.0, NULL, gFalse);
+      layoutText(fieldChoice->getChoice(i), &convertedText, &j, font, &w, 0.0, NULL, gFalse);
       if (w > wMax) {
         wMax = w;
       }
@@ -4608,7 +4346,7 @@
 
     // compute text width and start position
     j = 0;
-    layoutText(fieldChoice->getChoice(i), convertedText, &j, font, &w, 0.0, NULL, gFalse);
+    layoutText(fieldChoice->getChoice(i), &convertedText, &j, font, &w, 0.0, NULL, gFalse);
     w *= fontSize;
     switch (quadding) {
     case quaddingLeftJustified:
@@ -4651,7 +4389,7 @@
     }
 
     // write the text string
-    writeString(convertedText, appearBuf);
+    writeString(&convertedText, appearBuf.get());
     appearBuf->append(" Tj\n");
 
     // cleanup
@@ -4665,8 +4403,6 @@
   if (daToks) {
     deleteGooList(daToks, GooString);
   }
-
-  delete convertedText;
 }
 
 void AnnotWidget::drawBorder() {
@@ -4856,7 +4592,7 @@
   GfxResources *resources;
   GooString *da;
 
-  appearBuf = new GooString ();
+  appearBuf = std::make_unique<GooString>();
 
   // draw the background
   if (appearCharacs) {
@@ -4918,7 +4654,7 @@
   MemStream *appearStream = new MemStream(copyString(appearBuf->getCString()), 0,
       appearBuf->getLength(), Object(appearDict));
   appearance = Object(static_cast<Stream*>(appearStream));
-  delete appearBuf;
+  appearBuf = nullptr;
 
   appearStream->setNeedFree(gTrue);
 }
@@ -4954,7 +4690,7 @@
     obj1.dictAdd(copyString("N"), Object(updatedAppearanceStream.num, updatedAppearanceStream.gen));
 
     // Update our internal pointers to the appearance dictionary
-    appearStreams = new AnnotAppearance(doc, &obj1);
+    appearStreams = std::make_unique<AnnotAppearance>(doc, &obj1);
 
     update("AP", std::move(obj1));
   } else {
@@ -4995,7 +4731,7 @@
     gfx->pushResources(dict);
     delete dict;
   }
-  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(),
 		 rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
   if (addDingbatsResource) {
     gfx->popResources();
@@ -5013,7 +4749,7 @@
   type = typeMovie;
   annotObj.dictSet ("Subtype", Object(objName, "Movie"));
 
-  movie = movieA->copy();
+  movie.reset(movieA->copy());
   // TODO: create movie dict from movieA
 
   initialize(docA, annotObj.getDict());
@@ -5025,37 +4761,27 @@
   initialize(docA, dictObject->getDict());
 }
 
-AnnotMovie::~AnnotMovie() {
-  if (title)
-    delete title;
-  delete movie;
-}
-
 void AnnotMovie::initialize(PDFDoc *docA, Dict* dict) {
   Object obj1;
 
   obj1 = dict->lookup("T");
   if (obj1.isString()) {
-    title = obj1.getString()->copy();
-  } else {
-    title = NULL;
+    title.reset(obj1.getString()->copy());
   }
 
   Object movieDict = dict->lookup("Movie");
   if (movieDict.isDict()) {
     Object obj2 = dict->lookup("A");
     if (obj2.isDict())
-      movie = new Movie (&movieDict, &obj2);
+      movie = std::make_unique<Movie>(&movieDict, &obj2);
     else
-      movie = new Movie (&movieDict);
+      movie = std::make_unique<Movie>(&movieDict);
     if (!movie->isOk()) {
-      delete movie;
-      movie = NULL;
+      movie = nullptr;
       ok = gFalse;
     }
   } else {
     error(errSyntaxError, -1, "Bad Annot Movie");
-    movie = NULL;
     ok = gFalse;
   }
 }
@@ -5071,7 +4797,7 @@
     movie->getAspect(&width, &height);
 
     if (width != -1 && height != -1 && !poster.isNone()) {
-      appearBuf = new GooString ();
+      appearBuf = std::make_unique<GooString>();
       appearBuf->append ("q\n");
       appearBuf->appendf ("{0:d} 0 0 {1:d} 0 0 cm\n", width, height);
       appearBuf->append ("/MImg Do\n");
@@ -5106,7 +4832,6 @@
       MemStream *mStream = new MemStream(copyString(appearBuf->getCString()), 0,
 			      appearBuf->getLength(), Object(formDict));
       mStream->setNeedFree(gTrue);
-      delete appearBuf;
 
       Dict *dict = new Dict(gfx->getXRef());
       dict->set("FRM", Object(static_cast<Stream*>(mStream)));
@@ -5114,7 +4839,7 @@
       Dict *resDict2 = new Dict(gfx->getXRef());
       resDict2->set("XObject", Object(dict));
 
-      appearBuf = new GooString ();
+      appearBuf = std::make_unique<GooString>();
       appearBuf->append ("q\n");
       appearBuf->appendf ("0 0 {0:d} {1:d} re W n\n", width, height);
       appearBuf->append ("q\n");
@@ -5129,13 +4854,13 @@
       bbox[2] = width;
       bbox[3] = height;
       appearance = createForm(bbox, gFalse, resDict2);
-      delete appearBuf;
+      appearBuf = nullptr;
     }
   }
 
   // draw the appearance stream
   Object obj = appearance.fetch(gfx->getXRef());
-  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(),
 		 rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
 }
 
@@ -5158,39 +4883,29 @@
   initialize(docA, dictObject->getDict());
 }
 
-AnnotScreen::~AnnotScreen() {
-  delete title;
-  delete appearCharacs;
-  delete action;
-}
-
 void AnnotScreen::initialize(PDFDoc *docA, Dict* dict) {
   Object obj1;
 
-  title = NULL;
   obj1 = dict->lookup("T");
   if (obj1.isString()) {
-    title = obj1.getString()->copy();
+    title.reset(obj1.getString()->copy());
   }
 
-  action = NULL;
   obj1 = dict->lookup("A");
   if (obj1.isDict()) {
-    action = LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI());
+    action.reset(LinkAction::parseAction(&obj1, doc->getCatalog()->getBaseURI()));
     if (action->getKind() == actionRendition && page == 0) {
       error (errSyntaxError, -1, "Invalid Rendition action: associated screen annotation without P");
-      delete action;
-      action = NULL;
+      action = nullptr;
       ok = gFalse;
     }
   }
 
   additionalActions = dict->lookupNF("AA");
 
-  appearCharacs = NULL;
   obj1 = dict->lookup("MK");
   if (obj1.isDict()) {
-    appearCharacs = new AnnotAppearanceCharacs(obj1.getDict());
+    appearCharacs = std::make_unique<AnnotAppearanceCharacs>(obj1.getDict());
   }
 }
 
@@ -5220,27 +4935,21 @@
   initialize(docA, dictObject->getDict());
 }
 
-AnnotStamp::~AnnotStamp() {
-  delete icon;
-}
-
 void AnnotStamp::initialize(PDFDoc *docA, Dict* dict) {
   Object obj1 = dict->lookup("Name");
   if (obj1.isName()) {
-    icon = new GooString(obj1.getName());
+    icon = std::make_unique<GooString>(obj1.getName());
   } else {
-    icon = new GooString("Draft");
+    icon = std::make_unique<GooString>("Draft");
   }
 
 }
 
 void AnnotStamp::setIcon(GooString *new_icon) {
-  delete icon;
-
   if (new_icon) {
-    icon = new GooString (new_icon);
+    icon = std::make_unique<GooString>(new_icon);
   } else {
-    icon = new GooString();
+    icon = std::make_unique<GooString>();
   }
 
   update("Name", Object(objName, icon->getCString()));
@@ -5275,12 +4984,6 @@
   initialize(docA, dictObject->getDict());
 }
 
-AnnotGeometry::~AnnotGeometry() {
-  delete interiorColor;
-  delete borderEffect;
-  delete geometryRect;
-}
-
 void AnnotGeometry::initialize(PDFDoc *docA, Dict* dict) {
   Object obj1;
 
@@ -5296,30 +4999,24 @@
 
   obj1 = dict->lookup("IC");
   if (obj1.isArray()) {
-    interiorColor = new AnnotColor(obj1.getArray());
-  } else {
-    interiorColor = NULL;
+    interiorColor = std::make_unique<AnnotColor>(obj1.getArray());
   }
 
   obj1 = dict->lookup("BS");
   if (obj1.isDict()) {
-    delete border;
-    border = new AnnotBorderBS(obj1.getDict());
+    border = std::make_unique<AnnotBorderBS>(obj1.getDict());
   } else if (!border) {
-    border = new AnnotBorderBS();
+    border = std::make_unique<AnnotBorderBS>();
   }
 
   obj1 = dict->lookup("BE");
   if (obj1.isDict()) {
-    borderEffect = new AnnotBorderEffect(obj1.getDict());
-  } else {
-    borderEffect = NULL;
+    borderEffect = std::make_unique<AnnotBorderEffect>(obj1.getDict());
   }
 
-  geometryRect = NULL;
   obj1 = dict->lookup("RD");
   if (obj1.isArray()) {
-    geometryRect = parseDiffRectangle(obj1.getArray(), rect);
+    geometryRect = parseDiffRectangle(obj1.getArray(), rect.get());
   }
 }
 
@@ -5342,15 +5039,13 @@
   invalidateAppearance();
 }
 
-void AnnotGeometry::setInteriorColor(AnnotColor *new_color) {
-  delete interiorColor;
-
+void AnnotGeometry::setInteriorColor(std::unique_ptr<AnnotColor> &&new_color) {
   if (new_color) {
     Object obj1 = new_color->writeToObject(xref);
     update ("IC", std::move(obj1));
-    interiorColor = new_color;
+    interiorColor = std::move(new_color);
   } else {
-    interiorColor = NULL;
+    interiorColor = nullptr;
   }
   invalidateAppearance();
 }
@@ -5365,16 +5060,16 @@
   if (appearance.isNull()) {
     ca = opacity;
 
-    appearBuf = new GooString ();
+    appearBuf = std::make_unique<GooString>();
     appearBuf->append ("q\n");
     if (color)
-      setColor(color, gFalse);
+      setColor(color.get(), gFalse);
 
     double borderWidth = border->getWidth();
-    setLineStyleForBorder(border);
+    setLineStyleForBorder(border.get());
 
     if (interiorColor)
-      setColor(interiorColor, gTrue);
+      setColor(interiorColor.get(), gTrue);
 
     if (type == typeSquare) {
       appearBuf->appendf ("{0:.2f} {1:.2f} {2:.2f} {3:.2f} re\n",
@@ -5444,18 +5139,16 @@
       appearance = createForm(bbox, gFalse, nullptr);
     } else {
       Object aStream = createForm(bbox, gTrue, nullptr);
-      delete appearBuf;
-
-      appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
+      appearBuf = std::make_unique<GooString>("/GS0 gs\n/Fm0 Do");
       Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL);
       appearance = createForm(bbox, gFalse, resDict);
     }
-    delete appearBuf;
+    appearBuf = nullptr;
   }
 
   // draw the appearance stream
   Object obj = appearance.fetch(gfx->getXRef());
-  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(),
 		 rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
 }
 
@@ -5493,16 +5186,6 @@
   initialize(docA, dictObject->getDict());
 }
 
-AnnotPolygon::~AnnotPolygon() {
-  delete vertices;
-
-  if (interiorColor)
-    delete interiorColor;
-
-  if (borderEffect)
-    delete borderEffect;
-}
-
 void AnnotPolygon::initialize(PDFDoc *docA, Dict* dict) {
   Object obj1;
 
@@ -5518,9 +5201,9 @@
 
   obj1 = dict->lookup("Vertices");
   if (obj1.isArray()) {
-    vertices = new AnnotPath(obj1.getArray());
+    vertices = std::make_unique<AnnotPath>(obj1.getArray());
   } else {
-    vertices = new AnnotPath();
+    vertices = std::make_unique<AnnotPath>();
     error(errSyntaxError, -1, "Bad Annot Polygon Vertices");
     ok = gFalse;
   }
@@ -5545,24 +5228,19 @@
 
   obj1 = dict->lookup("IC");
   if (obj1.isArray()) {
-    interiorColor = new AnnotColor(obj1.getArray());
-  } else {
-    interiorColor = NULL;
+    interiorColor = std::make_unique<AnnotColor>(obj1.getArray());
   }
 
   obj1 = dict->lookup("BS");
   if (obj1.isDict()) {
-    delete border;
-    border = new AnnotBorderBS(obj1.getDict());
+    border = std::make_unique<AnnotBorderBS>(obj1.getDict());
   } else if (!border) {
-    border = new AnnotBorderBS();
+    border = std::make_unique<AnnotBorderBS>();
   }
 
   obj1 = dict->lookup("BE");
   if (obj1.isDict()) {
-    borderEffect = new AnnotBorderEffect(obj1.getDict());
-  } else {
-    borderEffect = NULL;
+    borderEffect = std::make_unique<AnnotBorderEffect>(obj1.getDict());
   }
 
   obj1 = dict->lookup("IT");
@@ -5601,15 +5279,13 @@
 }
 
 void AnnotPolygon::setVertices(AnnotPath *path) {
-  delete vertices;
-
   Array *a = new Array(xref);
   for (int i = 0; i < path->getCoordsLength(); i++) {
     a->add(Object(path->getX(i)));
     a->add(Object(path->getY(i)));
   }
 
-  vertices = new AnnotPath(a);
+  vertices = std::make_unique<AnnotPath>(a);
 
   update("Vertices", Object(a));
   invalidateAppearance();
@@ -5627,15 +5303,11 @@
   invalidateAppearance();
 }
 
-void AnnotPolygon::setInteriorColor(AnnotColor *new_color) {
-  delete interiorColor;
-
+void AnnotPolygon::setInteriorColor(std::unique_ptr<AnnotColor> &&new_color) {
   if (new_color) {
     Object obj1 = new_color->writeToObject(xref);
     update ("IC", std::move(obj1));
-    interiorColor = new_color;
-  } else {
-    interiorColor = NULL;
+    interiorColor = std::move(new_color);
   }
   invalidateAppearance();
 }
@@ -5661,21 +5333,21 @@
 
   annotLocker();
   if (appearance.isNull()) {
-    appearBBox = new AnnotAppearanceBBox(rect);
+    appearBBox = std::make_unique<AnnotAppearanceBBox>(rect.get());
     ca = opacity;
 
-    appearBuf = new GooString ();
+    appearBuf = std::make_unique<GooString>();
     appearBuf->append ("q\n");
 
     if (color) {
-      setColor(color, gFalse);
+      setColor(color.get(), gFalse);
     }
 
-    setLineStyleForBorder(border);
+    setLineStyleForBorder(border.get());
     appearBBox->setBorderWidth(std::max(1., border->getWidth()));
 
     if (interiorColor) {
-      setColor(interiorColor, gTrue);
+      setColor(interiorColor.get(), gTrue);
     }
 
     if (vertices->getCoordsLength() != 0) {
@@ -5706,24 +5378,22 @@
       appearance = createForm(bbox, gFalse, nullptr);
     } else {
       Object aStream = createForm(bbox, gTrue, nullptr);
-      delete appearBuf;
-
-      appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
+      appearBuf = std::make_unique<GooString>("/GS0 gs\n/Fm0 Do");
       Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL);
       appearance = createForm(bbox, gFalse, resDict);
     }
-    delete appearBuf;
+    appearBuf = nullptr;
   }
 
   // draw the appearance stream
   Object obj = appearance.fetch(gfx->getXRef());
   if (appearBBox) {
-    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(),
                    appearBBox->getPageXMin(), appearBBox->getPageYMin(),
                    appearBBox->getPageXMax(), appearBBox->getPageYMax(),
                    getRotation());
   } else {
-    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(),
                    rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
   }
 }
@@ -5747,10 +5417,6 @@
   initialize(docA, dictObject->getDict());
 }
 
-AnnotCaret::~AnnotCaret() {
-  delete caretRect;
-}
-
 void AnnotCaret::initialize(PDFDoc *docA, Dict* dict) {
   Object obj1;
 
@@ -5767,9 +5433,7 @@
 
   obj1 = dict->lookup("RD");
   if (obj1.isArray()) {
-    caretRect = parseDiffRectangle(obj1.getArray(), rect);
-  } else {
-    caretRect = NULL;
+    caretRect = parseDiffRectangle(obj1.getArray(), rect.get());
   }
 }
 
@@ -5827,10 +5491,9 @@
 
   obj1 = dict->lookup("BS");
   if (obj1.isDict()) {
-    delete border;
-    border = new AnnotBorderBS(obj1.getDict());
+    border = std::make_unique<AnnotBorderBS>(obj1.getDict());
   } else if (!border) {
-    border = new AnnotBorderBS();
+    border = std::make_unique<AnnotBorderBS>();
   }
 }
 
@@ -5884,17 +5547,17 @@
 
   annotLocker();
   if (appearance.isNull()) {
-    appearBBox = new AnnotAppearanceBBox(rect);
+    appearBBox = std::make_unique<AnnotAppearanceBBox>(rect.get());
     ca = opacity;
 
-    appearBuf = new GooString ();
+    appearBuf = std::make_unique<GooString>();
     appearBuf->append ("q\n");
 
     if (color) {
-      setColor(color, gFalse);
+      setColor(color.get(), gFalse);
     }
 
-    setLineStyleForBorder(border);
+    setLineStyleForBorder(border.get());
     appearBBox->setBorderWidth(std::max(1., border->getWidth()));
 
     for (int i = 0; i < inkListLength; ++i) {
@@ -5920,24 +5583,22 @@
       appearance = createForm(bbox, gFalse, nullptr);
     } else {
       Object aStream = createForm(bbox, gTrue, nullptr);
-      delete appearBuf;
-
-      appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
+      appearBuf = std::make_unique<GooString>("/GS0 gs\n/Fm0 Do");
       Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL);
       appearance = createForm(bbox, gFalse, resDict);
     }
-    delete appearBuf;
+    appearBuf = nullptr;
   }
 
   // draw the appearance stream
   Object obj = appearance.fetch(gfx->getXRef());
   if (appearBBox) {
-    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(),
                    appearBBox->getPageXMin(), appearBBox->getPageYMin(),
                    appearBBox->getPageXMax(), appearBBox->getPageYMax(),
                    getRotation());
   } else {
-    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+    gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(),
                    rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
   }
 }
@@ -5963,10 +5624,6 @@
   initialize(docA, dictObject->getDict());
 }
 
-AnnotFileAttachment::~AnnotFileAttachment() {
-  delete name;
-}
-
 void AnnotFileAttachment::initialize(PDFDoc *docA, Dict* dict) {
   Object obj1;
 
@@ -5980,9 +5637,9 @@
 
   obj1 = dict->lookup("Name");
   if (obj1.isName()) {
-    name = new GooString(obj1.getName());
+    name = std::make_unique<GooString>(obj1.getName());
   } else {
-    name = new GooString("PushPin");
+    name = std::make_unique<GooString>("PushPin");
   }
 }
 
@@ -6108,11 +5765,11 @@
   if (appearance.isNull()) {
     ca = opacity;
 
-    appearBuf = new GooString ();
+    appearBuf = std::make_unique<GooString>();
 
     appearBuf->append ("q\n");
     if (color)
-      setColor(color, gTrue);
+      setColor(color.get(), gTrue);
     else
       appearBuf->append ("1 1 1 rg\n");
     if (!name->cmp("PushPin"))
@@ -6132,18 +5789,16 @@
       appearance = createForm (bbox, gFalse, nullptr);
     } else {
       Object aStream = createForm (bbox, gTrue, nullptr);
-      delete appearBuf;
-
-      appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
+      appearBuf = std::make_unique<GooString>("/GS0 gs\n/Fm0 Do");
       Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL);
       appearance = createForm(bbox, gFalse, resDict);
     }
-    delete appearBuf;
+    appearBuf = nullptr;
   }
 
   // draw the appearance stream
   Object obj = appearance.fetch(gfx->getXRef());
-  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(),
 		 rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
 }
 
@@ -6168,16 +5823,10 @@
   initialize(docA, dictObject->getDict());
 }
 
-AnnotSound::~AnnotSound() {
-  delete sound;
-
-  delete name;
-}
-
 void AnnotSound::initialize(PDFDoc *docA, Dict* dict) {
   Object obj1 = dict->lookup("Sound");
 
-  sound = Sound::parseSound(&obj1);
+  sound.reset(Sound::parseSound(&obj1));
   if (!sound) {
     error(errSyntaxError, -1, "Bad Annot Sound");
     ok = gFalse;
@@ -6185,9 +5834,9 @@
 
   obj1 = dict->lookup("Name");
   if (obj1.isName()) {
-    name = new GooString(obj1.getName());
+    name = std::make_unique<GooString>(obj1.getName());
   } else {
-    name = new GooString("Speaker");
+    name = std::make_unique<GooString>("Speaker");
   }
 }
 
@@ -6265,11 +5914,11 @@
   if (appearance.isNull()) {
     ca = opacity;
 
-    appearBuf = new GooString ();
+    appearBuf = std::make_unique<GooString>();
 
     appearBuf->append ("q\n");
     if (color)
-      setColor(color, gTrue);
+      setColor(color.get(), gTrue);
     else
       appearBuf->append ("1 1 1 rg\n");
     if (!name->cmp("Speaker"))
@@ -6285,18 +5934,16 @@
       appearance = createForm(bbox, gFalse, nullptr);
     } else {
       Object aStream = createForm(bbox, gTrue, nullptr);
-      delete appearBuf;
-
-      appearBuf = new GooString ("/GS0 gs\n/Fm0 Do");
+      appearBuf = std::make_unique<GooString>("/GS0 gs\n/Fm0 Do");
       Dict *resDict = createResourcesDict("Fm0", std::move(aStream), "GS0", ca, NULL);
       appearance = createForm(bbox, gFalse, resDict);
     }
-    delete appearBuf;
+    appearBuf = nullptr;
   }
 
   // draw the appearance stream
   obj = appearance.fetch(gfx->getXRef());
-  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color,
+  gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color.get(),
 		 rect->x1, rect->y1, rect->x2, rect->y2, getRotation());
 }
 
@@ -6320,17 +5967,10 @@
   initialize(docA, dictObject->getDict());
 }
 
-Annot3D::~Annot3D() {
-  if (activation)
-    delete activation;
-}
-
 void Annot3D::initialize(PDFDoc *docA, Dict* dict) {
   Object obj1 = dict->lookup("3DA");
   if (obj1.isDict()) {
-    activation = new Activation(obj1.getDict());
-  } else {
-    activation = NULL;
+    activation = std::make_unique<Activation>(obj1.getDict());
   }
 }
 
@@ -6438,62 +6078,44 @@
   initialize(docA, dictObject->getDict());
 }
 
-AnnotRichMedia::~AnnotRichMedia() {
-  delete content;
-  delete settings;
-}
-
 void AnnotRichMedia::initialize(PDFDoc *docA, Dict* dict) {
   Object obj1 = dict->lookup("RichMediaContent");
   if (obj1.isDict()) {
-    content = new AnnotRichMedia::Content(obj1.getDict());
-  } else {
-    content = NULL;
+    content = std::make_unique<AnnotRichMedia::Content>(obj1.getDict());
   }
 
   obj1 = dict->lookup("RichMediaSettings");
   if (obj1.isDict()) {
-    settings = new AnnotRichMedia::Settings(obj1.getDict());
-  } else {
-    settings = NULL;
+    settings = std::make_unique<AnnotRichMedia::Settings>(obj1.getDict());
   }
 }
 
 AnnotRichMedia::Content* AnnotRichMedia::getContent() const {
-  return content;
+  return content.get();
 }
 
 AnnotRichMedia::Settings* AnnotRichMedia::getSettings() const {
-  return settings;
+  return settings.get();
 }
 
 AnnotRichMedia::Settings::Settings(Dict *dict) {
   Object obj1 = dict->lookup("Activation");
   if (obj1.isDict()) {
-    activation = new AnnotRichMedia::Activation(obj1.getDict());
-  } else {
-    activation = NULL;
+    activation = std::make_unique<AnnotRichMedia::Activation>(obj1.getDict());
   }
 
   obj1 = dict->lookup("Deactivation");
   if (obj1.isDict()) {
-    deactivation = new AnnotRichMedia::Deactivation(obj1.getDict());
-  } else {
-    deactivation = NULL;
+    deactivation = std::make_unique<AnnotRichMedia::Deactivation>(obj1.getDict());
   }
 }
 
-AnnotRichMedia::Settings::~Settings() {
-  delete activation;
-  delete deactivation;
-}
-
 AnnotRichMedia::Activation* AnnotRichMedia::Settings::getActivation() const {
-  return activation;
+  return activation.get();
 }
 
 AnnotRichMedia::Deactivation* AnnotRichMedia::Settings::getDeactivation() const {
-  return deactivation;
+  return deactivation.get();
 }
 
 AnnotRichMedia::Activation::Activation(Dict *dict) {
@@ -6579,7 +6201,7 @@
         Object objKey = obj2.arrayGet(i);
         assets[counter]->fileSpec = obj2.arrayGet(i + 1);
 
-        assets[counter]->name = new GooString( objKey.getString() );
+        assets[counter]->name = std::make_unique<GooString>( objKey.getString() );
         ++counter;
 
       }
@@ -6623,18 +6245,8 @@
   return assets[index];
 }
 
-AnnotRichMedia::Asset::Asset()
-  : name(NULL)
-{
-}
-
-AnnotRichMedia::Asset::~Asset()
-{
-  delete name;
-}
-
 GooString* AnnotRichMedia::Asset::getName() const {
-  return name;
+  return name.get();
 }
 
 Object* AnnotRichMedia::Asset::getFileSpec() const {
@@ -6663,9 +6275,7 @@
 
   obj1 = dict->lookup("Name");
   if (obj1.isString()) {
-    name = new GooString(obj1.getString());
-  } else {
-    name = NULL;
+    name = std::make_unique<GooString>(obj1.getString());
   }
 
   obj1 = dict->lookup("Subtype");
@@ -6713,8 +6323,6 @@
       delete instances[i];
     gfree(instances);
   }
-
-  delete name;
 }
 
 int AnnotRichMedia::Configuration::getInstancesCount() const {
@@ -6729,7 +6337,7 @@
 }
 
 GooString* AnnotRichMedia::Configuration::getName() const {
-  return name;
+  return name.get();
 }
 
 AnnotRichMedia::Configuration::Type AnnotRichMedia::Configuration::getType() const {
@@ -6755,42 +6363,28 @@
 
   obj1 = dict->lookup("Params");
   if (obj1.isDict()) {
-    params = new AnnotRichMedia::Params(obj1.getDict());
-  } else {
-    params = NULL;
+    params = std::make_unique<AnnotRichMedia::Params>(obj1.getDict());
   }
 }
 
-AnnotRichMedia::Instance::~Instance()
-{
-  delete params;
-}
-
 AnnotRichMedia::Instance::Type AnnotRichMedia::Instance::getType() const {
   return type;
 }
 
 AnnotRichMedia::Params* AnnotRichMedia::Instance::getParams() const {
-  return params;
+  return params.get();
 }
 
 AnnotRichMedia::Params::Params(Dict *dict)
 {
   Object obj1 = dict->lookup("FlashVars");
   if (obj1.isString()) {
-    flashVars = new GooString(obj1.getString());
-  } else {
-    flashVars = NULL;
+    flashVars = std::unique_ptr<GooString>(obj1.getString());
   }
 }
 
-AnnotRichMedia::Params::~Params()
-{
-  delete flashVars;
-}
-
 GooString* AnnotRichMedia::Params::getFlashVars() const {
-  return flashVars;
+  return flashVars.get();
 }
 
 //------------------------------------------------------------------------
diff --git a/poppler/Annot.h b/poppler/Annot.h
index 171494a..2e33315 100644
--- a/poppler/Annot.h
+++ b/poppler/Annot.h
@@ -88,7 +88,7 @@
 
   double getX() const { return x; }
   double getY() const { return y; }
-  
+
 protected:
 
   double x, y;
@@ -102,15 +102,15 @@
 public:
   AnnotPath();
   AnnotPath(Array *array);
-  AnnotPath(AnnotCoord **coords, int coordLength);
-  ~AnnotPath();
+  AnnotPath(std::unique_ptr<AnnotCoord[]> &&coords, int coordsLength);
+  ~AnnotPath() = default;
 
   double getX(int coord) const;
   double getY(int coord) const;
   AnnotCoord *getCoord(int coord) const;
   int getCoordsLength() const { return coordsLength; }
 protected:
-  AnnotCoord **coords;
+  std::unique_ptr<AnnotCoord[]> coords;
   int coordsLength;
 
   void parsePathArray(Array *array);
@@ -185,6 +185,7 @@
 public:
   class AnnotQuadrilateral {
   public:
+    AnnotQuadrilateral() = default;
     AnnotQuadrilateral(double x1, double y1, double x2, double y2, double x3,
       double y3, double x4, double y4);
 
@@ -192,8 +193,8 @@
   };
 
   AnnotQuadrilaterals(Array *array, PDFRectangle *rect);
-  AnnotQuadrilaterals(AnnotQuadrilateral **quads, int quadsLength);
-  ~AnnotQuadrilaterals();
+  AnnotQuadrilaterals(std::unique_ptr<AnnotQuadrilateral[]> &&quads, int quadsLength);
+  ~AnnotQuadrilaterals() = default;
 
   double getX1(int quadrilateral);
   double getY1(int quadrilateral);
@@ -206,7 +207,7 @@
   int getQuadrilateralsLength() const { return quadrilateralsLength; }
 protected:
 
-  AnnotQuadrilateral** quadrilaterals;
+  std::unique_ptr<AnnotQuadrilateral[]> quadrilaterals;
   int quadrilateralsLength;
 };
 
@@ -388,7 +389,7 @@
   Object getAppearanceStream(AnnotAppearanceType type, const char *state);
 
   // Access keys in normal appearance subdictionary (N)
-  GooString * getStateKey(int i);
+  std::unique_ptr<GooString> getStateKey(int i);
   int getNumStates();
 
   // Removes all associated streams in the xref table. Caller is required to
@@ -427,30 +428,30 @@
   };
 
   AnnotAppearanceCharacs(Dict *dict);
-  ~AnnotAppearanceCharacs();
+  ~AnnotAppearanceCharacs() = default;
 
   int getRotation() { return rotation; }
-  AnnotColor *getBorderColor() { return borderColor; }
-  AnnotColor *getBackColor() { return backColor; }
-  GooString *getNormalCaption() { return normalCaption; }
-  GooString *getRolloverCaption() { return rolloverCaption; }
-  GooString *getAlternateCaption() { return alternateCaption; }
-  AnnotIconFit *getIconFit() { return iconFit; }
+  AnnotColor *getBorderColor() { return borderColor.get(); }
+  AnnotColor *getBackColor() { return backColor.get(); }
+  GooString *getNormalCaption() { return normalCaption.get(); }
+  GooString *getRolloverCaption() { return rolloverCaption.get(); }
+  GooString *getAlternateCaption() { return alternateCaption.get(); }
+  AnnotIconFit *getIconFit() { return iconFit.get(); }
   AnnotAppearanceCharacsTextPos getPosition() { return position; }
 
 protected:
 
-  int rotation;                           // R  (Default 0)
-  AnnotColor *borderColor;                // BC
-  AnnotColor *backColor;                  // BG
-  GooString *normalCaption;               // CA
-  GooString *rolloverCaption;             // RC
-  GooString *alternateCaption;            // AC
+  int rotation;                                // R  (Default 0)
+  std::unique_ptr<AnnotColor> borderColor;     // BC
+  std::unique_ptr<AnnotColor> backColor;       // BG
+  std::unique_ptr<GooString> normalCaption;    // CA
+  std::unique_ptr<GooString> rolloverCaption;  // RC
+  std::unique_ptr<GooString> alternateCaption; // AC
   // I
   // RI
   // IX
-  AnnotIconFit *iconFit;                  // IF
-  AnnotAppearanceCharacsTextPos position; // TP (Default 0)
+  std::unique_ptr<AnnotIconFit> iconFit;       // IF
+  AnnotAppearanceCharacsTextPos position;      // TP (Default 0)
 };
 
 //------------------------------------------------------------------------
@@ -586,11 +587,8 @@
   void setModified(GooString *new_date);
   void setFlags(Guint new_flags);
 
-  void setBorder(AnnotBorder *new_border); // Takes ownership
-
-  // The annotation takes the ownership of
-  // new_color. 
-  void setColor(AnnotColor *new_color);
+  void setBorder(std::unique_ptr<AnnotBorder> &&new_border);
+  void setColor(std::unique_ptr<AnnotColor> &&new_color);
 
   void setAppearanceState(const char *state);
 
@@ -600,17 +598,17 @@
   GBool getHasRef() const { return hasRef; }
   Ref getRef() const { return ref; }
   AnnotSubtype getType() const { return type; }
-  PDFRectangle *getRect() const { return rect; }
+  PDFRectangle *getRect() const { return rect.get(); }
   void getRect(double *x1, double *y1, double *x2, double *y2) const;
-  GooString *getContents() const { return contents; }
+  GooString *getContents() const { return contents.get(); }
   int getPageNum() const { return page; }
-  GooString *getName() const { return name; }
-  GooString *getModified() const { return modified; }
+  GooString *getName() const { return name.get(); }
+  GooString *getModified() const { return modified.get(); }
   Guint getFlags() const { return flags; }
-  AnnotAppearance *getAppearStreams() const { return appearStreams; }
-  GooString *getAppearState() const { return appearState; }
-  AnnotBorder *getBorder() const { return border; }
-  AnnotColor *getColor() const { return color; }
+  AnnotAppearance *getAppearStreams() const { return appearStreams.get(); }
+  GooString *getAppearState() const { return appearState.get(); }
+  AnnotBorder *getBorder() const { return border.get(); }
+  AnnotColor *getColor() const { return color.get(); }
   int getTreeKey() const { return treeKey; }
 
   int getId() { return ref.num; }
@@ -656,30 +654,30 @@
   int refCnt;
   
   // required data
-  AnnotSubtype type;                // Annotation type
-  PDFRectangle *rect;               // Rect
+  AnnotSubtype type;                                // Annotation type
+  std::unique_ptr<PDFRectangle> rect;               // Rect
 
   // optional data
-  GooString *contents;              // Contents
-  GooString *name;                  // NM
-  GooString *modified;              // M
-  int       page;                   // P
-  Guint flags;                      // F (must be a 32 bit unsigned int)
-  AnnotAppearance *appearStreams;   // AP
-  Object appearance;     // a reference to the Form XObject stream
-                         //   for the normal appearance
-  AnnotAppearanceBBox *appearBBox;  // BBox of generated appearance
-  GooString *appearState;           // AS
-  int treeKey;                      // Struct Parent;
-  Object oc;                        // OC
+  std::unique_ptr<GooString> contents;              // Contents
+  std::unique_ptr<GooString> name;                  // NM
+  std::unique_ptr<GooString> modified;              // M
+  int       page;                                   // P
+  Guint flags;                                      // F (must be a 32 bit unsigned int)
+  std::unique_ptr<AnnotAppearance> appearStreams;   // AP
+  Object appearance;                                // a reference to the Form XObject stream
+                                                    //   for the normal appearance
+  std::unique_ptr<AnnotAppearanceBBox> appearBBox;  // BBox of generated appearance
+  std::unique_ptr<GooString> appearState;           // AS
+  int treeKey;                                      // Struct Parent;
+  Object oc;                                        // OC
 
   PDFDoc *doc;
-  XRef *xref;			// the xref table for this PDF file
-  Ref ref;                      // object ref identifying this annotation
-  GooString *appearBuf;
-  AnnotBorder *border;          // Border, BS
-  AnnotColor *color;            // C
-  double fontSize; 
+  XRef *xref;			                    // the xref table for this PDF file
+  Ref ref;                                          // object ref identifying this annotation
+  std::unique_ptr<GooString> appearBuf;
+  std::unique_ptr<AnnotBorder> border;              // Border, BS
+  std::unique_ptr<AnnotColor> color;                // C
+  double fontSize;
   GBool ok;
 
   bool hasRef;
@@ -724,21 +722,21 @@
 
   AnnotMarkup(PDFDoc *docA, PDFRectangle *rect);
   AnnotMarkup(PDFDoc *docA, Object *dictObject, Object *obj);
-  ~AnnotMarkup();
+  ~AnnotMarkup() = default;
 
   // getters
-  GooString *getLabel() const { return label; }
-  AnnotPopup *getPopup() const { return popup; }
+  GooString *getLabel() const { return label.get(); }
+  AnnotPopup *getPopup() const { return popup.get(); }
   double getOpacity() const { return opacity; }
   // getRC
-  GooString *getDate() const { return date; }
+  GooString *getDate() const { return date.get(); }
   int getInReplyToID() const { return inReplyTo.num; }
-  GooString *getSubject() const { return subject; }
+  GooString *getSubject() const { return subject.get(); }
   AnnotMarkupReplyType getReplyTo() const { return replyTo; }
   AnnotExternalDataType getExData() const { return exData; }
 
   // The annotation takes the ownership of new_popup
-  void setPopup(AnnotPopup *new_popup);
+  void setPopup(std::unique_ptr<AnnotPopup> &&new_popup);
   void setLabel(GooString *new_label);
   void setOpacity(double opacityA);
   void setDate(GooString *new_date);
@@ -746,18 +744,18 @@
 protected:
   void removeReferencedObjects() override;
 
-  GooString *label;             // T            (Default autor)
-  AnnotPopup *popup;            // Popup
-  double opacity;               // CA           (Default 1.0)
+  std::unique_ptr<GooString> label;   // T            (Default autor)
+  std::unique_ptr<AnnotPopup> popup;  // Popup
+  double opacity;                     // CA           (Default 1.0)
   // RC
-  GooString *date;              // CreationDate
-  Ref inReplyTo;                // IRT
-  GooString *subject;           // Subj
-  AnnotMarkupReplyType replyTo; // RT           (Default R)
+  std::unique_ptr<GooString> date;    // CreationDate
+  Ref inReplyTo;                      // IRT
+  std::unique_ptr<GooString> subject; // Subj
+  AnnotMarkupReplyType replyTo;       // RT           (Default R)
   // this object is overrided by the custom intent fields defined in some
   // annotation types.
-  //GooString *intent;          // IT
-  AnnotExternalDataType exData; // ExData
+  //GooString *intent;                // IT
+  AnnotExternalDataType exData;       // ExData
 
 private:
   void initialize(PDFDoc *docA, Dict *dict, Object *obj);
@@ -784,13 +782,13 @@
 
   AnnotText(PDFDoc *docA, PDFRectangle *rect);
   AnnotText(PDFDoc *docA, Object *dictObject, Object *obj);
-  ~AnnotText();
+  ~AnnotText() = default;
 
   void draw(Gfx *gfx, GBool printing) override;
 
   // getters
   GBool getOpen() const { return open; }
-  GooString *getIcon() const { return icon; }
+  GooString *getIcon() const { return icon.get(); }
   AnnotTextState getState() const { return state; }
 
   void setOpen(GBool openA);
@@ -801,7 +799,7 @@
   void initialize(PDFDoc *docA, Dict *dict);
 
   GBool open;                       // Open       (Default false)
-  GooString *icon;                  // Name       (Default Note)
+  std::unique_ptr<GooString> icon;  // Name       (Default Note)
   AnnotTextState state;             // State      (Default Umarked if
                                     //             StateModel Marked
                                     //             None if StareModel Review)
@@ -817,18 +815,18 @@
  public:
   AnnotMovie(PDFDoc *docA, PDFRectangle *rect, Movie *movieA);
   AnnotMovie(PDFDoc *docA, Object *dictObject, Object *obj);
-  ~AnnotMovie();
+  ~AnnotMovie() = default;
 
   void draw(Gfx *gfx, GBool printing) override;
 
-  GooString* getTitle() { return title; }
-  Movie* getMovie() { return movie; }
+  GooString* getTitle() { return title.get(); }
+  Movie* getMovie() { return movie.get(); }
 
  private:
   void initialize(PDFDoc *docA, Dict *dict);
 
-  GooString* title;      // T
-  Movie* movie;          // Movie + A
+  std::unique_ptr<GooString> title; // T
+  std::unique_ptr<Movie> movie;     // Movie + A
 };
 
 
@@ -841,24 +839,24 @@
 
   AnnotScreen(PDFDoc *docA, PDFRectangle *rect);
   AnnotScreen(PDFDoc *docA, Object *dictObject, Object *obj);
-  ~AnnotScreen();
+  ~AnnotScreen() = default;
 
-  GooString* getTitle() { return title; }
+  GooString* getTitle() { return title.get(); }
 
-  AnnotAppearanceCharacs *getAppearCharacs() { return appearCharacs; }
-  LinkAction* getAction() { return action; } // The caller should now delete the result
+  AnnotAppearanceCharacs *getAppearCharacs() { return appearCharacs.get(); }
+  LinkAction *getAction() { return action.get(); } // The caller should now delete the result
   LinkAction *getAdditionalAction(AdditionalActionsType type); // The caller should delete the result
 
  private:
   void initialize(PDFDoc *docA, Dict *dict);
 
 
-  GooString* title;                      // T
+  std::unique_ptr<GooString> title;                      // T
 
-  AnnotAppearanceCharacs* appearCharacs; // MK
+  std::unique_ptr<AnnotAppearanceCharacs> appearCharacs; // MK
 
-  LinkAction *action;                    // A
-  Object additionalActions;              // AA
+  std::unique_ptr<LinkAction> action;                    // A
+  Object additionalActions;                              // AA
 };
 
 //------------------------------------------------------------------------
@@ -877,25 +875,25 @@
 
   AnnotLink(PDFDoc *docA, PDFRectangle *rect);
   AnnotLink(PDFDoc *docA, Object *dictObject, Object *obj);
-  ~AnnotLink();
+  ~AnnotLink() = default;
 
   void draw(Gfx *gfx, GBool printing) override;
 
   // getters
-  LinkAction *getAction() const { return action; }
+  LinkAction *getAction() const { return action.get(); }
   AnnotLinkEffect getLinkEffect() const { return linkEffect; }
-  Dict *getUriAction() const { return uriAction; }
-  AnnotQuadrilaterals *getQuadrilaterals() const { return quadrilaterals; }
+  /*  Dict *getUriAction() const { return uriAction; } */
+  AnnotQuadrilaterals *getQuadrilaterals() const { return quadrilaterals.get(); }
 
 protected:
 
   void initialize(PDFDoc *docA, Dict *dict);
 
-  LinkAction *action;                  // A, Dest
-  AnnotLinkEffect linkEffect;          // H          (Default I)
-  Dict *uriAction;                     // PA
+  std::unique_ptr<LinkAction> action;                  // A, Dest
+  AnnotLinkEffect linkEffect;                          // H          (Default I)
+  //Dict *uriAction;                                   // PA
 
-  AnnotQuadrilaterals *quadrilaterals; // QuadPoints
+  std::unique_ptr<AnnotQuadrilaterals> quadrilaterals; // QuadPoints
 };
 
 //------------------------------------------------------------------------
@@ -919,7 +917,7 @@
 
   AnnotFreeText(PDFDoc *docA, PDFRectangle *rect, GooString *da);
   AnnotFreeText(PDFDoc *docA, Object *dictObject, Object *obj);
-  ~AnnotFreeText();
+  ~AnnotFreeText() = default;
 
   void draw(Gfx *gfx, GBool printing) override;
   Object getAppearanceResDict() override;
@@ -932,36 +930,36 @@
   void setIntent(AnnotFreeTextIntent new_intent);
 
   // getters
-  GooString *getAppearanceString() const { return appearanceString; }
+  GooString *getAppearanceString() const { return appearanceString.get(); }
   AnnotFreeTextQuadding getQuadding() const { return quadding; }
   // return rc
-  GooString *getStyleString() const { return styleString; }
-  AnnotCalloutLine *getCalloutLine() const {  return calloutLine; }
+  GooString *getStyleString() const { return styleString.get(); }
+  AnnotCalloutLine *getCalloutLine() const {  return calloutLine.get(); }
   AnnotFreeTextIntent getIntent() const { return intent; }
-  AnnotBorderEffect *getBorderEffect() const { return borderEffect; }
-  PDFRectangle *getRectangle() const { return rectangle; }
+  AnnotBorderEffect *getBorderEffect() const { return borderEffect.get(); }
+  PDFRectangle *getRectangle() const { return rectangle.get(); }
   AnnotLineEndingStyle getEndStyle() const { return endStyle; }
 
 protected:
 
   void initialize(PDFDoc *docA, Dict *dict);
-  static void parseAppearanceString(GooString *da, double &fontsize, AnnotColor* &fontcolor);
+  static void parseAppearanceString(GooString *da, double &fontsize, std::unique_ptr<AnnotColor> &fontcolor);
   void generateFreeTextAppearance();
 
   // required
-  GooString *appearanceString;      // DA
+  std::unique_ptr<GooString> appearanceString;      // DA
 
   // optional
-  AnnotFreeTextQuadding quadding;   // Q  (Default 0)
+  AnnotFreeTextQuadding quadding;                   // Q  (Default 0)
   // RC
-  GooString *styleString;           // DS
-  AnnotCalloutLine *calloutLine;    // CL
-  AnnotFreeTextIntent intent;       // IT
-  AnnotBorderEffect *borderEffect;  // BE
-  PDFRectangle *rectangle;          // RD
+  std::unique_ptr<GooString> styleString;           // DS
+  std::unique_ptr<AnnotCalloutLine> calloutLine;    // CL
+  AnnotFreeTextIntent intent;                       // IT
+  std::unique_ptr<AnnotBorderEffect> borderEffect;  // BE
+  std::unique_ptr<PDFRectangle> rectangle;          // RD
   // inherited  from Annot
-  // AnnotBorderBS border;          // BS
-  AnnotLineEndingStyle endStyle;    // LE (Default None)
+  // AnnotBorderBS border;                          // BS
+  AnnotLineEndingStyle endStyle;                    // LE (Default None)
 };
 
 //------------------------------------------------------------------------
@@ -983,7 +981,7 @@
 
   AnnotLine(PDFDoc *docA, PDFRectangle *rect);
   AnnotLine(PDFDoc *docA, Object *dictObject, Object *obj);
-  ~AnnotLine();
+  ~AnnotLine() = default;
 
   void draw(Gfx *gfx, GBool printing) override;
   Object getAppearanceResDict() override;
@@ -991,7 +989,7 @@
 
   void setVertices(double x1, double y1, double x2, double y2);
   void setStartEndStyle(AnnotLineEndingStyle start, AnnotLineEndingStyle end);
-  void setInteriorColor(AnnotColor *new_color);
+  void setInteriorColor(std::unique_ptr<AnnotColor> &&new_color);
   void setLeaderLineLength(double len);
   void setLeaderLineExtension(double len);
   void setCaption(bool new_cap);
@@ -1000,7 +998,7 @@
   // getters
   AnnotLineEndingStyle getStartStyle() const { return startStyle; }
   AnnotLineEndingStyle getEndStyle() const { return endStyle; }
-  AnnotColor *getInteriorColor() const { return interiorColor; }
+  AnnotColor *getInteriorColor() const { return interiorColor.get(); }
   double getLeaderLineLength() const { return leaderLineLength; }
   double getLeaderLineExtension() const { return leaderLineExtension; }
   bool getCaption() const { return caption; }
@@ -1021,23 +1019,24 @@
   void generateLineAppearance();
 
   // required
-  AnnotCoord *coord1, *coord2;
-  
+  std::unique_ptr<AnnotCoord> coord1;
+  std::unique_ptr<AnnotCoord> coord2;
+
   // optional
   // inherited  from Annot
-  // AnnotBorderBS border;          // BS
-  AnnotLineEndingStyle startStyle;  // LE       (Default [/None /None])
-  AnnotLineEndingStyle endStyle;    //
-  AnnotColor *interiorColor;        // IC
-  double leaderLineLength;          // LL       (Default 0)
-  double leaderLineExtension;       // LLE      (Default 0)
-  bool caption;                     // Cap      (Default false)
-  AnnotLineIntent intent;           // IT
-  double leaderLineOffset;          // LLO
-  AnnotLineCaptionPos captionPos;   // CP       (Default Inline)
-  Dict *measure;                    // Measure
-  double captionTextHorizontal;     // CO       (Default [0, 0])
-  double captionTextVertical;       //
+  // AnnotBorderBS border;                   // BS
+  AnnotLineEndingStyle startStyle;           // LE       (Default [/None /None])
+  AnnotLineEndingStyle endStyle;             //
+  std::unique_ptr<AnnotColor> interiorColor; // IC
+  double leaderLineLength;                   // LL       (Default 0)
+  double leaderLineExtension;                // LLE      (Default 0)
+  bool caption;                              // Cap      (Default false)
+  AnnotLineIntent intent;                    // IT
+  double leaderLineOffset;                   // LLO
+  AnnotLineCaptionPos captionPos;            // CP       (Default Inline)
+  Dict *measure;                             // Measure
+  double captionTextHorizontal;              // CO       (Default [0, 0])
+  double captionTextVertical;                //
 };
 
 //------------------------------------------------------------------------
@@ -1049,7 +1048,7 @@
 
   AnnotTextMarkup(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType);
   AnnotTextMarkup(PDFDoc *docA, Object *dictObject, Object *obj);
-  ~AnnotTextMarkup();
+  ~AnnotTextMarkup() = default;
 
   void draw(Gfx *gfx, GBool printing) override;
 
@@ -1058,13 +1057,13 @@
 
   void setQuadrilaterals(AnnotQuadrilaterals *quadPoints);
 
-  AnnotQuadrilaterals *getQuadrilaterals() const { return quadrilaterals; }
+  AnnotQuadrilaterals *getQuadrilaterals() const { return quadrilaterals.get(); }
 
 protected:
 
   void initialize(PDFDoc *docA, Dict *dict);
-  
-  AnnotQuadrilaterals *quadrilaterals; // QuadPoints
+
+  std::unique_ptr<AnnotQuadrilaterals> quadrilaterals; // QuadPoints
 };
 
 //------------------------------------------------------------------------
@@ -1076,18 +1075,18 @@
 
   AnnotStamp(PDFDoc *docA, PDFRectangle *rect);
   AnnotStamp(PDFDoc *docA, Object *dictObject, Object *obj);
-  ~AnnotStamp();
+  ~AnnotStamp() = default;
 
   void setIcon(GooString *new_icon);
 
   // getters
-  GooString *getIcon() const { return icon; }
+  GooString *getIcon() const { return icon.get(); }
 
 private:
 
   void initialize(PDFDoc *docA, Dict *dict);
 
-  GooString *icon;                  // Name       (Default Draft)
+  std::unique_ptr<GooString> icon; // Name       (Default Draft)
 };
 
 //------------------------------------------------------------------------
@@ -1099,25 +1098,25 @@
 
   AnnotGeometry(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType);
   AnnotGeometry(PDFDoc *docA, Object *dictObject, Object *obj);
-  ~AnnotGeometry();
+  ~AnnotGeometry() = default;
 
   void draw(Gfx *gfx, GBool printing) override;
 
   void setType(AnnotSubtype new_type); // typeSquare or typeCircle
-  void setInteriorColor(AnnotColor *new_color);
+  void setInteriorColor(std::unique_ptr<AnnotColor> &&new_color);
 
   // getters
-  AnnotColor *getInteriorColor() const { return interiorColor; }
-  AnnotBorderEffect *getBorderEffect() const { return borderEffect; }
-  PDFRectangle *getGeometryRect() const { return geometryRect; }
+  AnnotColor *getInteriorColor() const { return interiorColor.get(); }
+  AnnotBorderEffect *getBorderEffect() const { return borderEffect.get(); }
+  PDFRectangle *getGeometryRect() const { return geometryRect.get(); }
 
 private:
 
   void initialize(PDFDoc *docA, Dict *dict);
 
-  AnnotColor *interiorColor;        // IC
-  AnnotBorderEffect *borderEffect;  // BE
-  PDFRectangle *geometryRect;       // RD (combined with Rect)
+  std::unique_ptr<AnnotColor> interiorColor;       // IC
+  std::unique_ptr<AnnotBorderEffect> borderEffect; // BE
+  std::unique_ptr<PDFRectangle> geometryRect;      // RD (combined with Rect)
 };
 
 //------------------------------------------------------------------------
@@ -1135,22 +1134,22 @@
 
   AnnotPolygon(PDFDoc *docA, PDFRectangle *rect, AnnotSubtype subType);
   AnnotPolygon(PDFDoc *docA, Object *dictObject, Object *obj);
-  ~AnnotPolygon();
+  ~AnnotPolygon() = default;
 
   void draw(Gfx *gfx, GBool printing) override;
 
   void setType(AnnotSubtype new_type); // typePolygon or typePolyLine
   void setVertices(AnnotPath *path);
   void setStartEndStyle(AnnotLineEndingStyle start, AnnotLineEndingStyle end);
-  void setInteriorColor(AnnotColor *new_color);
+  void setInteriorColor(std::unique_ptr<AnnotColor> &&new_color);
   void setIntent(AnnotPolygonIntent new_intent);
 
   // getters
-  AnnotPath *getVertices() const { return vertices; }
+  AnnotPath *getVertices() const { return vertices.get(); }
   AnnotLineEndingStyle getStartStyle() const { return startStyle; }
   AnnotLineEndingStyle getEndStyle() const { return endStyle; }
-  AnnotColor *getInteriorColor() const { return interiorColor; }
-  AnnotBorderEffect *getBorderEffect() const { return borderEffect; }
+  AnnotColor *getInteriorColor() const { return interiorColor.get(); }
+  AnnotBorderEffect *getBorderEffect() const { return borderEffect.get(); }
   AnnotPolygonIntent getIntent() const { return intent; }
 
 private:
@@ -1158,16 +1157,16 @@
   void initialize(PDFDoc *docA, Dict *dict);
 
   // required
-  AnnotPath *vertices;              // Vertices
+  std::unique_ptr<AnnotPath> vertices;              // Vertices
 
   // optional
-  AnnotLineEndingStyle startStyle;  // LE       (Default [/None /None])
-  AnnotLineEndingStyle endStyle;    //
+  AnnotLineEndingStyle startStyle;                  // LE       (Default [/None /None])
+  AnnotLineEndingStyle endStyle;                    //
   // inherited  from Annot
-  // AnnotBorderBS border;          // BS
-  AnnotColor *interiorColor;        // IC
-  AnnotBorderEffect *borderEffect;  // BE
-  AnnotPolygonIntent intent;        // IT
+  // AnnotBorderBS border;                          // BS
+  std::unique_ptr<AnnotColor> interiorColor;        // IC
+  std::unique_ptr<AnnotBorderEffect> borderEffect;  // BE
+  AnnotPolygonIntent intent;                        // IT
   // Measure
 };
 
@@ -1185,20 +1184,20 @@
 
   AnnotCaret(PDFDoc *docA, PDFRectangle *rect);
   AnnotCaret(PDFDoc *docA, Object *dictObject, Object *obj);
-  ~AnnotCaret();
+  ~AnnotCaret() = default;
 
   void setSymbol(AnnotCaretSymbol new_symbol);
 
   // getters
   AnnotCaretSymbol getSymbol() const { return symbol; }
-  PDFRectangle *getCaretRect() const { return caretRect; }
+  PDFRectangle *getCaretRect() const { return caretRect.get(); }
 
 private:
 
   void initialize(PDFDoc *docA, Dict *dict);
 
-  AnnotCaretSymbol symbol;       // Sy         (Default None)
-  PDFRectangle *caretRect;       // RD (combined with Rect)
+  AnnotCaretSymbol symbol;                 // Sy         (Default None)
+  std::unique_ptr<PDFRectangle> caretRect; // RD (combined with Rect)
 };
 
 //------------------------------------------------------------------------
@@ -1245,23 +1244,23 @@
 
   AnnotFileAttachment(PDFDoc *docA, PDFRectangle *rect, GooString *filename);
   AnnotFileAttachment(PDFDoc *docA, Object *dictObject, Object *obj);
-  ~AnnotFileAttachment();
+  ~AnnotFileAttachment() = default;
 
   void draw(Gfx *gfx, GBool printing) override;
 
   // getters
   Object *getFile() { return &file; }
-  GooString *getName() const { return name; }
+  GooString *getName() const { return name.get(); }
 
 private:
 
   void initialize(PDFDoc *docA, Dict *dict);
 
   // required
-  Object file;      // FS
+  Object file;                      // FS
 
   // optional
-  GooString *name;  // Name
+  std::unique_ptr<GooString> name;  // Name
 };
 
 //------------------------------------------------------------------------
@@ -1273,23 +1272,23 @@
 
   AnnotSound(PDFDoc *docA, PDFRectangle *rect, Sound *soundA);
   AnnotSound(PDFDoc *docA, Object *dictObject, Object *obj);
-  ~AnnotSound();
+  ~AnnotSound() = default;
 
   void draw(Gfx *gfx, GBool printing) override;
 
   // getters
-  Sound *getSound() { return sound; }
-  GooString *getName() const { return name; }
+  Sound *getSound() { return sound.get(); }
+  GooString *getName() const { return name.get(); }
 
 private:
 
   void initialize(PDFDoc *docA, Dict *dict);
 
   // required
-  Sound *sound;                  // Sound
+  std::unique_ptr<Sound> sound;    // Sound
 
   // optional
-  GooString *name;               // Name
+  std::unique_ptr<GooString> name; // Name
 };
 
 //------------------------------------------------------------------------
@@ -1308,7 +1307,7 @@
 
   AnnotWidget(PDFDoc *docA, Object *dictObject, Object *obj);
   AnnotWidget(PDFDoc *docA, Object *dictObject, Object *obj, FormField *fieldA);
-  ~AnnotWidget();
+  ~AnnotWidget() = default;
 
   void draw(Gfx *gfx, GBool printing) override;
 
@@ -1320,8 +1319,8 @@
   void updateAppearanceStream ();
 
   AnnotWidgetHighlightMode getMode() { return mode; }
-  AnnotAppearanceCharacs *getAppearCharacs() { return appearCharacs; }
-  LinkAction *getAction() { return action; }  // The caller should not delete the result
+  AnnotAppearanceCharacs *getAppearCharacs() { return appearCharacs.get(); }
+  LinkAction *getAction() { return action.get(); }  // The caller should not delete the result
   LinkAction *getAdditionalAction(AdditionalActionsType type); // The caller should delete the result
   LinkAction *getFormAdditionalAction(FormAdditionalActionsType type); // The caller should delete the result
   Dict *getParent() { return parent; }
@@ -1338,14 +1337,14 @@
 		   GooString *da, GfxResources *resources, int quadding);
 
   Form *form;
-  FormField *field;                       // FormField object for this annotation
-  AnnotWidgetHighlightMode mode;          // H  (Default I)
-  AnnotAppearanceCharacs *appearCharacs;  // MK
-  LinkAction *action;                     // A
-  Object additionalActions;               // AA
+  FormField *field;                                       // FormField object for this annotation
+  AnnotWidgetHighlightMode mode;                          // H  (Default I)
+  std::unique_ptr<AnnotAppearanceCharacs> appearCharacs;  // MK
+  std::unique_ptr<LinkAction> action;                     // A
+  Object additionalActions;                               // AA
   // inherited  from Annot
-  // AnnotBorderBS border;                // BS
-  Dict *parent;                           // Parent
+  // AnnotBorderBS border;                                // BS
+  Dict *parent;                                           // Parent
   GBool addDingbatsResource;
   Ref updatedAppearanceStream; // {-1,-1} if updateAppearanceStream has never been called
 };
@@ -1398,7 +1397,7 @@
 
   Annot3D(PDFDoc *docA, PDFRectangle *rect);
   Annot3D(PDFDoc *docA, Object *dictObject, Object *obj);
-  ~Annot3D();
+  ~Annot3D() = default;
 
   // getters
 
@@ -1406,7 +1405,7 @@
 
   void initialize(PDFDoc *docA, Dict *dict);
 
-  Activation *activation;  // 3DA
+  std::unique_ptr<Activation> activation;  // 3DA
 };
 
 //------------------------------------------------------------------------
@@ -1418,13 +1417,13 @@
   class Params {
   public:
     Params(Dict *dict);
-    ~Params();
+    ~Params() = default;
 
     GooString* getFlashVars() const;
 
   private:
     // optional
-    GooString *flashVars; // FlashVars
+    std::unique_ptr<GooString> flashVars; // FlashVars
   };
 
   class Instance {
@@ -1437,15 +1436,15 @@
     };
 
     Instance(Dict *dict);
-    ~Instance();
+    ~Instance() = default;
 
     Type getType() const;
     Params* getParams() const;
 
   private:
     // optional
-    Type type;     // Subtype
-    Params *params; // Params
+    Type type;                      // Subtype
+    std::unique_ptr<Params> params; // Params
   };
 
   class Configuration {
@@ -1467,9 +1466,9 @@
 
   private:
     // optional
-    Type type;            // Subtype
-    GooString *name;      // Name
-    Instance **instances; // Instances
+    Type type;                       // Subtype
+    std::unique_ptr<GooString> name; // Name
+    Instance **instances;            // Instances
     int nInstances;
   };
 
@@ -1477,8 +1476,8 @@
 
   class Asset {
   public:
-    Asset();
-    ~Asset();
+    Asset() = default;
+    ~Asset() = default;
 
     GooString* getName() const;
     Object* getFileSpec() const;
@@ -1486,7 +1485,7 @@
   private:
     friend class AnnotRichMedia::Content;
 
-    GooString *name;
+    std::unique_ptr<GooString> name;
     Object fileSpec;
   };
 
@@ -1503,7 +1502,7 @@
 
   private:
     // optional
-    Configuration **configurations; // Configurations
+    Configuration** configurations; // Configurations
     int nConfigurations;
 
     Asset **assets; // Assets
@@ -1547,20 +1546,20 @@
   class Settings {
   public:
     Settings(Dict *dict);
-    ~Settings();
+    ~Settings() = default;
 
     Activation* getActivation() const;
     Deactivation* getDeactivation() const;
 
   private:
     // optional
-    Activation *activation;
-    Deactivation *deactivation;
+    std::unique_ptr<Activation> activation;
+    std::unique_ptr<Deactivation> deactivation;
   };
 
   AnnotRichMedia(PDFDoc *docA, PDFRectangle *rect);
   AnnotRichMedia(PDFDoc *docA, Object *dictObject, Object *obj);
-  ~AnnotRichMedia();
+  ~AnnotRichMedia() = default;
 
   Content* getContent() const;
 
@@ -1570,10 +1569,10 @@
   void initialize(PDFDoc *docA, Dict *dict);
 
   // required
-  Content *content;     // RichMediaContent
+  std::unique_ptr<Content> content;     // RichMediaContent
 
   // optional
-  Settings *settings;   // RichMediaSettings
+  std::unique_ptr<Settings> settings;   // RichMediaSettings
 };
 
 
diff --git a/qt4/src/poppler-annotation-helper.h b/qt4/src/poppler-annotation-helper.h
index 3150569..8419b0b 100644
--- a/qt4/src/poppler-annotation-helper.h
+++ b/qt4/src/poppler-annotation-helper.h
@@ -176,6 +176,6 @@
 }
 
 QColor convertAnnotColor( AnnotColor *color );
-AnnotColor* convertQColor( const QColor &color );
+std::unique_ptr<AnnotColor> convertQColor( const QColor &color );
 
 }
diff --git a/qt4/src/poppler-annotation.cc b/qt4/src/poppler-annotation.cc
index 8a7f60b..f4733b8 100644
--- a/qt4/src/poppler-annotation.cc
+++ b/qt4/src/poppler-annotation.cc
@@ -350,7 +350,7 @@
 AnnotPath * AnnotationPrivate::toAnnotPath(const QLinkedList<QPointF> &list) const
 {
     const int count = list.size();
-    AnnotCoord **ac = (AnnotCoord **) gmallocn(count, sizeof(AnnotCoord*));
+    auto ac = std::make_unique<AnnotCoord[]>(count);
 
     double MTX[6];
     fillTransformationMTX(MTX);
@@ -360,10 +360,10 @@
     {
         double x, y;
         XPDFReader::invTransform( MTX, p, x, y );
-        ac[pos++] = new AnnotCoord(x, y);
+        ac[pos++] = AnnotCoord(x, y);
     }
 
-    return new AnnotPath(ac, count);
+    return new AnnotPath(std::move(ac), count);
 }
 
 QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentData *doc, const QSet<Annotation::SubType> &subtypes, int parentID)
@@ -1653,11 +1653,11 @@
     if (markupann)
         markupann->setOpacity( style.opacity() );
 
-    AnnotBorderArray * border = new AnnotBorderArray();
+    auto border = std::make_unique<AnnotBorderArray>();
     border->setWidth( style.width() );
     border->setHorizontalCorner( style.xCorners() );
     border->setVerticalCorner( style.yCorners() );
-    d->pdfAnnot->setBorder(border);
+    d->pdfAnnot->setBorder(std::move(border));
 }
 
 Annotation::Popup Annotation::popup() const
@@ -2721,17 +2721,17 @@
         return;
     }
 
-    AnnotColor * c = convertQColor(color);
+    auto c = convertQColor(color);
 
     if (d->pdfAnnot->getType() == Annot::typeLine)
     {
         AnnotLine *lineann = static_cast<AnnotLine*>(d->pdfAnnot);
-        lineann->setInteriorColor(c);
+        lineann->setInteriorColor(std::move(c));
     }
     else
     {
         AnnotPolygon *polyann = static_cast<AnnotPolygon*>(d->pdfAnnot);
-        polyann->setInteriorColor(c);
+        polyann->setInteriorColor(std::move(c));
     }
 }
 
@@ -5077,12 +5077,12 @@
     return newcolor;
 }
 
-AnnotColor* convertQColor( const QColor &c )
+std::unique_ptr<AnnotColor> convertQColor( const QColor &c )
 {
     if (!c.isValid() || c.alpha() == 0)
-        return new AnnotColor(); // Transparent
+        return std::make_unique<AnnotColor>(); // Transparent
     else
-        return new AnnotColor(c.redF(), c.greenF(), c.blueF());
+        return std::make_unique<AnnotColor>(c.redF(), c.greenF(), c.blueF());
 }
 //END utility annotation functions
 
diff --git a/qt5/src/poppler-annotation-helper.h b/qt5/src/poppler-annotation-helper.h
index 3150569..8419b0b 100644
--- a/qt5/src/poppler-annotation-helper.h
+++ b/qt5/src/poppler-annotation-helper.h
@@ -176,6 +176,6 @@
 }
 
 QColor convertAnnotColor( AnnotColor *color );
-AnnotColor* convertQColor( const QColor &color );
+std::unique_ptr<AnnotColor> convertQColor( const QColor &color );
 
 }
diff --git a/qt5/src/poppler-annotation.cc b/qt5/src/poppler-annotation.cc
index dfd5690..459689a 100644
--- a/qt5/src/poppler-annotation.cc
+++ b/qt5/src/poppler-annotation.cc
@@ -350,7 +350,7 @@
 AnnotPath * AnnotationPrivate::toAnnotPath(const QLinkedList<QPointF> &list) const
 {
     const int count = list.size();
-    AnnotCoord **ac = (AnnotCoord **) gmallocn(count, sizeof(AnnotCoord*));
+    auto ac = std::make_unique<AnnotCoord[]>(count);
 
     double MTX[6];
     fillTransformationMTX(MTX);
@@ -360,10 +360,10 @@
     {
         double x, y;
         XPDFReader::invTransform( MTX, p, x, y );
-        ac[pos++] = new AnnotCoord(x, y);
+        ac[pos++] = AnnotCoord(x, y);
     }
 
-    return new AnnotPath(ac, count);
+    return new AnnotPath(std::move(ac), count);
 }
 
 QList<Annotation*> AnnotationPrivate::findAnnotations(::Page *pdfPage, DocumentData *doc, const QSet<Annotation::SubType> &subtypes, int parentID)
@@ -1650,11 +1650,11 @@
     if (markupann)
         markupann->setOpacity( style.opacity() );
 
-    AnnotBorderArray * border = new AnnotBorderArray();
+    auto border = std::make_unique<AnnotBorderArray>();
     border->setWidth( style.width() );
     border->setHorizontalCorner( style.xCorners() );
     border->setVerticalCorner( style.yCorners() );
-    d->pdfAnnot->setBorder(border);
+    d->pdfAnnot->setBorder(std::move(border));
 }
 
 Annotation::Popup Annotation::popup() const
@@ -2708,17 +2708,17 @@
         return;
     }
 
-    AnnotColor * c = convertQColor(color);
+    auto c = convertQColor(color);
 
     if (d->pdfAnnot->getType() == Annot::typeLine)
     {
         AnnotLine *lineann = static_cast<AnnotLine*>(d->pdfAnnot);
-        lineann->setInteriorColor(c);
+        lineann->setInteriorColor(std::move(c));
     }
     else
     {
         AnnotPolygon *polyann = static_cast<AnnotPolygon*>(d->pdfAnnot);
-        polyann->setInteriorColor(c);
+        polyann->setInteriorColor(std::move(c));
     }
 }
 
@@ -5065,12 +5065,12 @@
     return newcolor;
 }
 
-AnnotColor* convertQColor( const QColor &c )
+std::unique_ptr<AnnotColor> convertQColor( const QColor &c )
 {
     if (!c.isValid() || c.alpha() == 0)
-        return new AnnotColor(); // Transparent
+        return std::make_unique<AnnotColor>(); // Transparent
     else
-        return new AnnotColor(c.redF(), c.greenF(), c.blueF());
+        return std::make_unique<AnnotColor>(c.redF(), c.greenF(), c.blueF());
 }
 //END utility annotation functions
 
