diff --git a/core/include/fpdfapi/fpdf_objects.h b/core/include/fpdfapi/fpdf_objects.h
index c220a0c..e80801c 100644
--- a/core/include/fpdfapi/fpdf_objects.h
+++ b/core/include/fpdfapi/fpdf_objects.h
@@ -115,7 +115,8 @@
   const CPDF_String* AsString() const;
 
  protected:
-  CPDF_Object(FX_DWORD type) : m_Type(type), m_ObjNum(0), m_GenNum(0) {}
+  explicit CPDF_Object(FX_DWORD type)
+      : m_Type(type), m_ObjNum(0), m_GenNum(0) {}
   ~CPDF_Object() {}
   void Destroy();
 
@@ -136,10 +137,9 @@
 };
 class CPDF_Boolean : public CPDF_Object {
  public:
-  static CPDF_Boolean* Create(FX_BOOL value) { return new CPDF_Boolean(value); }
-
   CPDF_Boolean() : CPDF_Object(PDFOBJ_BOOLEAN), m_bValue(false) {}
-  CPDF_Boolean(FX_BOOL value) : CPDF_Object(PDFOBJ_BOOLEAN), m_bValue(value) {}
+  explicit CPDF_Boolean(FX_BOOL value)
+      : CPDF_Object(PDFOBJ_BOOLEAN), m_bValue(value) {}
 
   FX_BOOL Identical(CPDF_Boolean* pOther) const {
     return m_bValue == pOther->m_bValue;
@@ -158,21 +158,13 @@
 
 class CPDF_Number : public CPDF_Object {
  public:
-  static CPDF_Number* Create(int value) { return new CPDF_Number(value); }
-
-  static CPDF_Number* Create(FX_FLOAT value) { return new CPDF_Number(value); }
-
-  static CPDF_Number* Create(const CFX_ByteStringC& str) {
-    return new CPDF_Number(str);
-  }
-
   CPDF_Number() : CPDF_Object(PDFOBJ_NUMBER), m_bInteger(TRUE), m_Integer(0) {}
 
-  CPDF_Number(int value);
+  explicit CPDF_Number(int value);
 
-  CPDF_Number(FX_FLOAT value);
+  explicit CPDF_Number(FX_FLOAT value);
 
-  CPDF_Number(const CFX_ByteStringC& str);
+  explicit CPDF_Number(const CFX_ByteStringC& str);
 
   FX_BOOL Identical(CPDF_Number* pOther) const;
 
@@ -215,20 +207,12 @@
 
 class CPDF_String : public CPDF_Object {
  public:
-  static CPDF_String* Create(const CFX_ByteString& str, FX_BOOL bHex = FALSE) {
-    return new CPDF_String(str, bHex);
-  }
-
-  static CPDF_String* Create(const CFX_WideString& str) {
-    return new CPDF_String(str);
-  }
-
   CPDF_String() : CPDF_Object(PDFOBJ_STRING), m_bHex(FALSE) {}
 
-  CPDF_String(const CFX_ByteString& str, FX_BOOL bHex = FALSE)
+  CPDF_String(const CFX_ByteString& str, FX_BOOL bHex)
       : CPDF_Object(PDFOBJ_STRING), m_String(str), m_bHex(bHex) {}
 
-  CPDF_String(const CFX_WideString& str);
+  explicit CPDF_String(const CFX_WideString& str);
 
   CFX_ByteString& GetString() { return m_String; }
 
@@ -253,21 +237,12 @@
 
 class CPDF_Name : public CPDF_Object {
  public:
-  static CPDF_Name* Create(const CFX_ByteString& str) {
-    return new CPDF_Name(str);
-  }
-
-  static CPDF_Name* Create(const CFX_ByteStringC& str) {
-    return new CPDF_Name(str);
-  }
-
-  static CPDF_Name* Create(const FX_CHAR* str) { return new CPDF_Name(str); }
-
-  CPDF_Name(const CFX_ByteString& str)
+  explicit CPDF_Name(const CFX_ByteString& str)
       : CPDF_Object(PDFOBJ_NAME), m_Name(str) {}
-  CPDF_Name(const CFX_ByteStringC& str)
+  explicit CPDF_Name(const CFX_ByteStringC& str)
       : CPDF_Object(PDFOBJ_NAME), m_Name(str) {}
-  CPDF_Name(const FX_CHAR* str) : CPDF_Object(PDFOBJ_NAME), m_Name(str) {}
+  explicit CPDF_Name(const FX_CHAR* str)
+      : CPDF_Object(PDFOBJ_NAME), m_Name(str) {}
 
   CFX_ByteString& GetString() { return m_Name; }
 
@@ -288,8 +263,6 @@
 
 class CPDF_Array : public CPDF_Object {
  public:
-  static CPDF_Array* Create() { return new CPDF_Array(); }
-
   CPDF_Array() : CPDF_Object(PDFOBJ_ARRAY) {}
 
   FX_DWORD GetCount() const { return m_Objects.GetSize(); }
@@ -365,8 +338,6 @@
 
 class CPDF_Dictionary : public CPDF_Object {
  public:
-  static CPDF_Dictionary* Create() { return new CPDF_Dictionary(); }
-
   CPDF_Dictionary() : CPDF_Object(PDFOBJ_DICTIONARY) {}
 
   CPDF_Object* GetElement(const CFX_ByteStringC& key) const;
@@ -565,10 +536,9 @@
 
 class CPDF_Null : public CPDF_Object {
  public:
-  static CPDF_Null* Create() { return new CPDF_Null(); }
-
   CPDF_Null() : CPDF_Object(PDFOBJ_NULL) {}
 };
+
 class CPDF_Reference : public CPDF_Object {
  public:
   CPDF_Reference(CPDF_IndirectObjects* pDoc, int objnum)
@@ -599,7 +569,7 @@
 
 class CPDF_IndirectObjects {
  public:
-  CPDF_IndirectObjects(CPDF_Parser* pParser);
+  explicit CPDF_IndirectObjects(CPDF_Parser* pParser);
 
   ~CPDF_IndirectObjects();
 
diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp
index 5810da5..f00cf5f 100644
--- a/core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp
+++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_content.cpp
@@ -106,7 +106,7 @@
     return;
   }
   CPDF_Stream* pStream = new CPDF_Stream(NULL, 0, NULL);
-  CPDF_Dictionary* pFormDict = CPDF_Dictionary::Create();
+  CPDF_Dictionary* pFormDict = new CPDF_Dictionary;
   pFormDict->SetAtName("Type", "XObject");
   pFormDict->SetAtName("Subtype", "Form");
   CFX_FloatRect bbox = m_pPage->GetPageBBox();
diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
index b200b8d..328728e 100644
--- a/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
+++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp
@@ -2010,7 +2010,7 @@
   FX_BOOL bNewId = !m_pIDArray;
   if (!m_pIDArray) {
     FX_DWORD* pBuffer = NULL;
-    m_pIDArray = CPDF_Array::Create();
+    m_pIDArray = new CPDF_Array;
     CPDF_Object* pID1 = pOldIDArray ? pOldIDArray->GetElement(0) : NULL;
     if (pID1) {
       m_pIDArray->Add(pID1->Clone());
@@ -2018,7 +2018,7 @@
       pBuffer = FX_Alloc(FX_DWORD, 4);
       PDF_GenerateFileID((FX_DWORD)(uintptr_t) this, m_dwLastObjNum, pBuffer);
       CFX_ByteStringC bsBuffer((const uint8_t*)pBuffer, 4 * sizeof(FX_DWORD));
-      m_pIDArray->Add(CPDF_String::Create(bsBuffer, TRUE), m_pDocument);
+      m_pIDArray->Add(new CPDF_String(bsBuffer, TRUE), m_pDocument);
     }
     FX_Free(pBuffer);
   }
@@ -2034,7 +2034,7 @@
     FX_DWORD* pBuffer = FX_Alloc(FX_DWORD, 4);
     PDF_GenerateFileID((FX_DWORD)(uintptr_t) this, m_dwLastObjNum, pBuffer);
     CFX_ByteStringC bsBuffer((const uint8_t*)pBuffer, 4 * sizeof(FX_DWORD));
-    m_pIDArray->Add(CPDF_String::Create(bsBuffer, TRUE), m_pDocument);
+    m_pIDArray->Add(new CPDF_String(bsBuffer, TRUE), m_pDocument);
     FX_Free(pBuffer);
     return;
   }
diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp
index 10b0272..2b68a04 100644
--- a/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp
+++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_image.cpp
@@ -33,7 +33,7 @@
     csname = "DeviceRGB";
   } else if (num_comps == 4) {
     csname = "DeviceCMYK";
-    CPDF_Array* pDecode = CPDF_Array::Create();
+    CPDF_Array* pDecode = new CPDF_Array;
     for (int n = 0; n < 4; n++) {
       pDecode->AddInteger(1);
       pDecode->AddInteger(0);
@@ -151,7 +151,7 @@
       pBuf[4] = (FX_CHAR)set_g;
       pBuf[5] = (FX_CHAR)set_b;
       ct.ReleaseBuffer(6);
-      pCS->Add(CPDF_String::Create(ct, TRUE));
+      pCS->Add(new CPDF_String(ct, TRUE));
       pDict->SetAt("ColorSpace", pCS);
     }
     pDict->SetAtInteger("BitsPerComponent", 1);
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
index 3170b55..7b3f805 100644
--- a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
@@ -390,7 +390,7 @@
   if (pFont) {
     return pFont;
   }
-  CPDF_Dictionary* pDict = CPDF_Dictionary::Create();
+  CPDF_Dictionary* pDict = new CPDF_Dictionary;
   pDict->SetAtName("Type", "Font");
   pDict->SetAtName("Subtype", "Type1");
   pDict->SetAtName("BaseFont", fontname);
@@ -1391,28 +1391,29 @@
   }
   if (predefined) {
     if (predefined == PDFFONT_ENCODING_WINANSI) {
-      return CPDF_Name::Create("WinAnsiEncoding");
+      return new CPDF_Name("WinAnsiEncoding");
     }
     if (predefined == PDFFONT_ENCODING_MACROMAN) {
-      return CPDF_Name::Create("MacRomanEncoding");
+      return new CPDF_Name("MacRomanEncoding");
     }
     if (predefined == PDFFONT_ENCODING_MACEXPERT) {
-      return CPDF_Name::Create("MacExpertEncoding");
+      return new CPDF_Name("MacExpertEncoding");
     }
     return NULL;
   }
-  CPDF_Dictionary* pDict = CPDF_Dictionary::Create();
-  pDict->SetAtName("BaseEncoding", "WinAnsiEncoding");
   const FX_WORD* pStandard =
       PDF_UnicodesForPredefinedCharSet(PDFFONT_ENCODING_WINANSI);
-  CPDF_Array* pDiff = CPDF_Array::Create();
+  CPDF_Array* pDiff = new CPDF_Array;
   for (int i = 0; i < 256; i++) {
     if (pStandard[i] == m_Unicodes[i]) {
       continue;
     }
-    pDiff->Add(CPDF_Number::Create(i));
-    pDiff->Add(CPDF_Name::Create(PDF_AdobeNameFromUnicode(m_Unicodes[i])));
+    pDiff->Add(new CPDF_Number(i));
+    pDiff->Add(new CPDF_Name(PDF_AdobeNameFromUnicode(m_Unicodes[i])));
   }
+
+  CPDF_Dictionary* pDict = new CPDF_Dictionary;
+  pDict->SetAtName("BaseEncoding", "WinAnsiEncoding");
   pDict->SetAt("Differences", pDiff);
   return pDict;
 }
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp
index e90c53c..865c6b7 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser.cpp
@@ -114,7 +114,7 @@
   if (len > 32) {
     m_ParamBuf1[index].m_Type = 0;
     m_ParamBuf1[index].m_pObject =
-        CPDF_Name::Create(PDF_NameDecode(CFX_ByteStringC(name, len)));
+        new CPDF_Name(PDF_NameDecode(CFX_ByteStringC(name, len)));
   } else {
     m_ParamBuf1[index].m_Type = PDFOBJ_NAME;
     if (!FXSYS_memchr(name, '#', len)) {
@@ -165,15 +165,15 @@
   _ContentParam& param = m_ParamBuf1[real_index];
   if (param.m_Type == PDFOBJ_NUMBER) {
     CPDF_Number* pNumber = param.m_Number.m_bInteger
-                               ? CPDF_Number::Create(param.m_Number.m_Integer)
-                               : CPDF_Number::Create(param.m_Number.m_Float);
+                               ? new CPDF_Number(param.m_Number.m_Integer)
+                               : new CPDF_Number(param.m_Number.m_Float);
 
     param.m_Type = 0;
     param.m_pObject = pNumber;
     return pNumber;
   }
   if (param.m_Type == PDFOBJ_NAME) {
-    CPDF_Name* pName = CPDF_Name::Create(
+    CPDF_Name* pName = new CPDF_Name(
         CFX_ByteString(param.m_Name.m_Buffer, param.m_Name.m_Len));
     param.m_Type = 0;
     param.m_pObject = pName;
@@ -524,7 +524,7 @@
               _PDF_InlineValueAbbr,
               sizeof _PDF_InlineValueAbbr / sizeof(_FX_BSTR), name);
           if (!fullname.IsEmpty()) {
-            pArray->SetAt(i, CPDF_Name::Create(fullname));
+            pArray->SetAt(i, new CPDF_Name(fullname));
           }
         } else {
           _PDF_ReplaceAbbr(pElement);
@@ -587,7 +587,7 @@
               _PDF_InlineValueAbbr,
               sizeof _PDF_InlineValueAbbr / sizeof(_FX_BSTR), name);
           if (!abbrName.IsEmpty()) {
-            pArray->SetAt(i, CPDF_Name::Create(abbrName));
+            pArray->SetAt(i, new CPDF_Name(abbrName));
           }
         } else {
           _PDF_ReplaceFull(pElement);
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
index 2f68d78..02ac27a 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
@@ -75,7 +75,7 @@
 void _PDF_ReplaceAbbr(CPDF_Object* pObj);
 void CPDF_StreamContentParser::Handle_BeginImage() {
   FX_FILESIZE savePos = m_pSyntax->GetPos();
-  CPDF_Dictionary* pDict = CPDF_Dictionary::Create();
+  CPDF_Dictionary* pDict = new CPDF_Dictionary;
   while (1) {
     CPDF_StreamParser::SyntaxType type = m_pSyntax->ParseNextElement();
     if (type == CPDF_StreamParser::Keyword) {
@@ -516,16 +516,16 @@
 
   if (m_WordSize == 4) {
     if (*(FX_DWORD*)m_WordBuffer == FXDWORD_TRUE) {
-      m_pLastObj = CPDF_Boolean::Create(TRUE);
+      m_pLastObj = new CPDF_Boolean(TRUE);
       return Others;
     }
     if (*(FX_DWORD*)m_WordBuffer == FXDWORD_NULL) {
-      m_pLastObj = CPDF_Null::Create();
+      m_pLastObj = new CPDF_Null;
       return Others;
     }
   } else if (m_WordSize == 5) {
     if (*(FX_DWORD*)m_WordBuffer == FXDWORD_FALS && m_WordBuffer[4] == 'e') {
-      m_pLastObj = CPDF_Boolean::Create(FALSE);
+      m_pLastObj = new CPDF_Boolean(FALSE);
       return Others;
     }
   }
@@ -603,42 +603,40 @@
   }
   if (bIsNumber) {
     m_WordBuffer[m_WordSize] = 0;
-    return CPDF_Number::Create(CFX_ByteStringC(m_WordBuffer, m_WordSize));
+    return new CPDF_Number(CFX_ByteStringC(m_WordBuffer, m_WordSize));
   }
   int first_char = m_WordBuffer[0];
   if (first_char == '/') {
-    return CPDF_Name::Create(
+    return new CPDF_Name(
         PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)));
   }
   if (first_char == '(') {
-    return CPDF_String::Create(ReadString());
+    return new CPDF_String(ReadString(), FALSE);
   }
   if (first_char == '<') {
     if (m_WordSize == 1) {
-      return CPDF_String::Create(ReadHexString(), TRUE);
+      return new CPDF_String(ReadHexString(), TRUE);
     }
-    CPDF_Dictionary* pDict = CPDF_Dictionary::Create();
+    CPDF_Dictionary* pDict = new CPDF_Dictionary;
     while (1) {
       GetNextWord(bIsNumber);
       if (m_WordSize == 0) {
         pDict->Release();
-        return NULL;
+        return nullptr;
       }
       if (m_WordSize == 2 && m_WordBuffer[0] == '>') {
         break;
       }
       if (m_WordBuffer[0] != '/') {
         pDict->Release();
-        return NULL;
+        return nullptr;
       }
       CFX_ByteString key =
           PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1));
       CPDF_Object* pObj = ReadNextObject(TRUE);
       if (!pObj) {
-        if (pDict) {
-          pDict->Release();
-        }
-        return NULL;
+        pDict->Release();
+        return nullptr;
       }
       if (!key.IsEmpty()) {
         pDict->SetAt(key, pObj);
@@ -652,31 +650,29 @@
     if (!bAllowNestedArray && bInArray) {
       return NULL;
     }
-    CPDF_Array* pArray = CPDF_Array::Create();
+    CPDF_Array* pArray = new CPDF_Array;
     while (1) {
       CPDF_Object* pObj = ReadNextObject(bAllowNestedArray, TRUE);
-      if (!pObj) {
-        if (m_WordSize == 0 || m_WordBuffer[0] == ']') {
-          return pArray;
-        }
-        if (m_WordBuffer[0] == '[') {
-          continue;
-        }
-      } else {
+      if (pObj) {
         pArray->Add(pObj);
+        continue;
       }
+
+      if (m_WordSize == 0 || m_WordBuffer[0] == ']')
+        break;
     }
+    return pArray;
   }
   if (m_WordSize == 4) {
     if (*(FX_DWORD*)m_WordBuffer == FXDWORD_TRUE) {
-      return CPDF_Boolean::Create(TRUE);
+      return new CPDF_Boolean(TRUE);
     }
     if (*(FX_DWORD*)m_WordBuffer == FXDWORD_NULL) {
-      return CPDF_Null::Create();
+      return new CPDF_Null;
     }
   } else if (m_WordSize == 5) {
     if (*(FX_DWORD*)m_WordBuffer == FXDWORD_FALS && m_WordBuffer[4] == 'e') {
-      return CPDF_Boolean::Create(FALSE);
+      return new CPDF_Boolean(FALSE);
     }
   }
   return NULL;
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
index c503277..1322864 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_objects.cpp
@@ -544,7 +544,7 @@
 }
 void CPDF_Array::AddString(const CFX_ByteString& str) {
   ASSERT(IsArray());
-  Add(new CPDF_String(str));
+  Add(new CPDF_String(str, FALSE));
 }
 void CPDF_Array::AddInteger(int i) {
   ASSERT(IsArray());
@@ -781,7 +781,7 @@
 }
 void CPDF_Dictionary::SetAtString(const CFX_ByteStringC& key,
                                   const CFX_ByteString& str) {
-  SetAt(key, new CPDF_String(str));
+  SetAt(key, new CPDF_String(str, FALSE));
 }
 void CPDF_Dictionary::SetAtReference(const CFX_ByteStringC& key,
                                      CPDF_IndirectObjects* pDoc,
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
index 97f1703..1b341f8 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
@@ -2033,17 +2033,17 @@
     m_Pos = SavedPos;
     if (bTypeOnly)
       return (CPDF_Object*)PDFOBJ_NUMBER;
-    return CPDF_Number::Create(word);
+    return new CPDF_Number(word);
   }
   if (word == "true" || word == "false") {
     if (bTypeOnly)
       return (CPDF_Object*)PDFOBJ_BOOLEAN;
-    return CPDF_Boolean::Create(word == "true");
+    return new CPDF_Boolean(word == "true");
   }
   if (word == "null") {
     if (bTypeOnly)
       return (CPDF_Object*)PDFOBJ_NULL;
-    return CPDF_Null::Create();
+    return new CPDF_Null;
   }
   if (word == "(") {
     if (bTypeOnly)
@@ -2052,7 +2052,7 @@
     if (m_pCryptoHandler && bDecrypt) {
       m_pCryptoHandler->Decrypt(objnum, gennum, str);
     }
-    return CPDF_String::Create(str, FALSE);
+    return new CPDF_String(str, FALSE);
   }
   if (word == "<") {
     if (bTypeOnly)
@@ -2061,12 +2061,12 @@
     if (m_pCryptoHandler && bDecrypt) {
       m_pCryptoHandler->Decrypt(objnum, gennum, str);
     }
-    return CPDF_String::Create(str, TRUE);
+    return new CPDF_String(str, TRUE);
   }
   if (word == "[") {
     if (bTypeOnly)
       return (CPDF_Object*)PDFOBJ_ARRAY;
-    CPDF_Array* pArray = CPDF_Array::Create();
+    CPDF_Array* pArray = new CPDF_Array;
     while (CPDF_Object* pObj = GetObject(pObjList, objnum, gennum))
       pArray->Add(pObj);
 
@@ -2075,7 +2075,7 @@
   if (word[0] == '/') {
     if (bTypeOnly)
       return (CPDF_Object*)PDFOBJ_NAME;
-    return CPDF_Name::Create(
+    return new CPDF_Name(
         PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)));
   }
   if (word == "<<") {
@@ -2088,7 +2088,7 @@
     int32_t nKeys = 0;
     FX_FILESIZE dwSignValuePos = 0;
     nonstd::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict(
-        CPDF_Dictionary::Create());
+        new CPDF_Dictionary);
     while (1) {
       FX_BOOL bIsNumber;
       CFX_ByteString key = GetNextWord(bIsNumber);
@@ -2194,17 +2194,17 @@
     m_Pos = SavedPos;
     if (bTypeOnly)
       return (CPDF_Object*)PDFOBJ_NUMBER;
-    return CPDF_Number::Create(word);
+    return new CPDF_Number(word);
   }
   if (word == "true" || word == "false") {
     if (bTypeOnly)
       return (CPDF_Object*)PDFOBJ_BOOLEAN;
-    return CPDF_Boolean::Create(word == "true");
+    return new CPDF_Boolean(word == "true");
   }
   if (word == "null") {
     if (bTypeOnly)
       return (CPDF_Object*)PDFOBJ_NULL;
-    return CPDF_Null::Create();
+    return new CPDF_Null;
   }
   if (word == "(") {
     if (bTypeOnly)
@@ -2212,7 +2212,7 @@
     CFX_ByteString str = ReadString();
     if (m_pCryptoHandler)
       m_pCryptoHandler->Decrypt(objnum, gennum, str);
-    return CPDF_String::Create(str, FALSE);
+    return new CPDF_String(str, FALSE);
   }
   if (word == "<") {
     if (bTypeOnly)
@@ -2220,13 +2220,13 @@
     CFX_ByteString str = ReadHexString();
     if (m_pCryptoHandler)
       m_pCryptoHandler->Decrypt(objnum, gennum, str);
-    return CPDF_String::Create(str, TRUE);
+    return new CPDF_String(str, TRUE);
   }
   if (word == "[") {
     if (bTypeOnly)
       return (CPDF_Object*)PDFOBJ_ARRAY;
     nonstd::unique_ptr<CPDF_Array, ReleaseDeleter<CPDF_Array>> pArray(
-        CPDF_Array::Create());
+        new CPDF_Array);
     while (CPDF_Object* pObj = GetObject(pObjList, objnum, gennum))
       pArray->Add(pObj);
     return m_WordBuffer[0] == ']' ? pArray.release() : nullptr;
@@ -2234,7 +2234,7 @@
   if (word[0] == '/') {
     if (bTypeOnly)
       return (CPDF_Object*)PDFOBJ_NAME;
-    return CPDF_Name::Create(
+    return new CPDF_Name(
         PDF_NameDecode(CFX_ByteStringC(m_WordBuffer + 1, m_WordSize - 1)));
   }
   if (word == "<<") {
@@ -2244,7 +2244,7 @@
       pContext->m_DictStart = SavedPos;
 
     nonstd::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict(
-        CPDF_Dictionary::Create());
+        new CPDF_Dictionary);
     while (1) {
       FX_BOOL bIsNumber;
       FX_FILESIZE SavedPos = m_Pos;
diff --git a/core/src/fpdfdoc/doc_ap.cpp b/core/src/fpdfdoc/doc_ap.cpp
index 0efaa8c..d0adc06 100644
--- a/core/src/fpdfdoc/doc_ap.cpp
+++ b/core/src/fpdfdoc/doc_ap.cpp
@@ -311,10 +311,7 @@
     return FALSE;
   }
   if (!pFontDict) {
-    pFontDict = CPDF_Dictionary::Create();
-    if (!pFontDict) {
-      return FALSE;
-    }
+    pFontDict = new CPDF_Dictionary;
     pFontDict->SetAtName("Type", "Font");
     pFontDict->SetAtName("Subtype", "Type1");
     pFontDict->SetAtName("BaseFont", "Helvetica");
@@ -419,7 +416,7 @@
   rcBody.Normalize();
   CPDF_Dictionary* pAPDict = pAnnotDict->GetDict("AP");
   if (!pAPDict) {
-    pAPDict = CPDF_Dictionary::Create();
+    pAPDict = new CPDF_Dictionary;
     pAnnotDict->SetAt("AP", pAPDict);
   }
   CPDF_Stream* pNormalStream = pAPDict->GetStream("N");
@@ -436,10 +433,7 @@
     if (pStreamResList) {
       CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict("Font");
       if (!pStreamResFontList) {
-        pStreamResFontList = CPDF_Dictionary::Create();
-        if (!pStreamResFontList) {
-          return FALSE;
-        }
+        pStreamResFontList = new CPDF_Dictionary;
         pStreamResList->SetAt("Font", pStreamResFontList);
       }
       if (!pStreamResFontList->KeyExist(sFontName)) {
@@ -684,10 +678,7 @@
       if (pStreamResList) {
         CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict("Font");
         if (!pStreamResFontList) {
-          pStreamResFontList = CPDF_Dictionary::Create();
-          if (!pStreamResFontList) {
-            return FALSE;
-          }
+          pStreamResFontList = new CPDF_Dictionary;
           pStreamResList->SetAt("Font", pStreamResFontList);
         }
         if (!pStreamResFontList->KeyExist(sFontName)) {
diff --git a/core/src/fpdfdoc/doc_basic.cpp b/core/src/fpdfdoc/doc_basic.cpp
index d976650..3fb9978 100644
--- a/core/src/fpdfdoc/doc_basic.cpp
+++ b/core/src/fpdfdoc/doc_basic.cpp
@@ -329,7 +329,7 @@
   return TRUE;
 }
 CPDF_FileSpec::CPDF_FileSpec() {
-  m_pObj = CPDF_Dictionary::Create();
+  m_pObj = new CPDF_Dictionary;
   if (CPDF_Dictionary* pDict = ToDictionary(m_pObj)) {
     pDict->SetAtName("Type", "Filespec");
   }
diff --git a/core/src/fpdfdoc/doc_form.cpp b/core/src/fpdfdoc/doc_form.cpp
index 20b59cd..9f949cc 100644
--- a/core/src/fpdfdoc/doc_form.cpp
+++ b/core/src/fpdfdoc/doc_form.cpp
@@ -1048,10 +1048,7 @@
       pMainDict->SetAt("F", static_cast<CPDF_Object*>(filespec));
     }
   }
-  CPDF_Array* pFields = CPDF_Array::Create();
-  if (!pFields) {
-    return NULL;
-  }
+  CPDF_Array* pFields = new CPDF_Array;
   pMainDict->SetAt("Fields", pFields);
   int nCount = m_pFieldTree->m_Root.CountFields();
   for (int i = 0; i < nCount; i++) {
@@ -1069,16 +1066,8 @@
         continue;
 
       CFX_WideString fullname = GetFullName(pField->GetFieldDict());
-      CPDF_Dictionary* pFieldDict = CPDF_Dictionary::Create();
-      if (!pFieldDict)
-        return nullptr;
-
-      CPDF_String* pString = CPDF_String::Create(fullname);
-      if (!pString) {
-        pFieldDict->Release();
-        return nullptr;
-      }
-      pFieldDict->SetAt("T", pString);
+      CPDF_Dictionary* pFieldDict = new CPDF_Dictionary;
+      pFieldDict->SetAt("T", new CPDF_String(fullname));
       if (pField->GetType() == CPDF_FormField::CheckBox ||
           pField->GetType() == CPDF_FormField::RadioButton) {
         CFX_WideString csExport = pField->GetCheckValue(FALSE);
diff --git a/core/src/fpdfdoc/doc_formfield.cpp b/core/src/fpdfdoc/doc_formfield.cpp
index 987dbd6..46ea010 100644
--- a/core/src/fpdfdoc/doc_formfield.cpp
+++ b/core/src/fpdfdoc/doc_formfield.cpp
@@ -571,7 +571,7 @@
             m_pDict->RemoveAt("V");
           }
         } else if (pValue->IsArray()) {
-          CPDF_Array* pArray = CPDF_Array::Create();
+          CPDF_Array* pArray = new CPDF_Array;
           int iCount = CountOptions();
           for (int i = 0; i < iCount; i++) {
             if (i != index) {
@@ -598,13 +598,10 @@
       if (!(m_Flags & FORMLIST_MULTISELECT)) {
         m_pDict->SetAtString("V", PDF_EncodeText(opt_value));
       } else {
-        CPDF_Array* pArray = CPDF_Array::Create();
-        if (!pArray) {
-          return FALSE;
-        }
-        FX_BOOL bSelected;
+        CPDF_Array* pArray = new CPDF_Array;
         int iCount = CountOptions();
         for (int i = 0; i < iCount; i++) {
+          FX_BOOL bSelected;
           if (i != index) {
             bSelected = IsItemSelected(i);
           } else {
@@ -619,10 +616,7 @@
       }
     } else if (m_Type == ComboBox) {
       m_pDict->SetAtString("V", PDF_EncodeText(opt_value));
-      CPDF_Array* pI = CPDF_Array::Create();
-      if (!pI) {
-        return FALSE;
-      }
+      CPDF_Array* pI = new CPDF_Array;
       pI->AddInteger(index);
       m_pDict->SetAt("I", pI);
     }
@@ -906,10 +900,7 @@
     if (!bSelected) {
       return TRUE;
     }
-    pArray = CPDF_Array::Create();
-    if (!pArray) {
-      return FALSE;
-    }
+    pArray = new CPDF_Array;
     m_pDict->SetAt("I", pArray);
   }
   FX_BOOL bReturn = FALSE;
@@ -952,10 +943,7 @@
           return FALSE;
         }
       }
-      CPDF_Number* pNum = CPDF_Number::Create(iOptIndex);
-      if (!pNum) {
-        return FALSE;
-      }
+      CPDF_Number* pNum = new CPDF_Number(iOptIndex);
       pArray->InsertAt(i, pNum);
       bReturn = TRUE;
       break;
diff --git a/core/src/fpdfdoc/doc_utils.cpp b/core/src/fpdfdoc/doc_utils.cpp
index b0705ea..01a7470 100644
--- a/core/src/fpdfdoc/doc_utils.cpp
+++ b/core/src/fpdfdoc/doc_utils.cpp
@@ -228,7 +228,7 @@
     return;
   }
   if (!pFormDict) {
-    pFormDict = CPDF_Dictionary::Create();
+    pFormDict = new CPDF_Dictionary;
     FX_DWORD dwObjNum = pDocument->AddIndirectObject(pFormDict);
     CPDF_Dictionary* pRoot = pDocument->GetRoot();
     pRoot->SetAtReference("AcroForm", pDocument, dwObjNum);
@@ -560,12 +560,12 @@
   }
   CPDF_Dictionary* pDR = pFormDict->GetDict("DR");
   if (!pDR) {
-    pDR = CPDF_Dictionary::Create();
+    pDR = new CPDF_Dictionary;
     pFormDict->SetAt("DR", pDR);
   }
   CPDF_Dictionary* pFonts = pDR->GetDict("Font");
   if (!pFonts) {
-    pFonts = CPDF_Dictionary::Create();
+    pFonts = new CPDF_Dictionary;
     pDR->SetAt("Font", pFonts);
   }
   if (csNameTag.IsEmpty()) {
diff --git a/fpdfsdk/src/fpdfeditpage.cpp b/fpdfsdk/src/fpdfeditpage.cpp
index a5fff45..9f707b9 100644
--- a/fpdfsdk/src/fpdfeditpage.cpp
+++ b/fpdfsdk/src/fpdfeditpage.cpp
@@ -37,7 +37,7 @@
   pInfoDict = pDoc->GetInfo();
   if (pInfoDict) {
     if (FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
-      pInfoDict->SetAt("CreationDate", new CPDF_String(DateStr));
+      pInfoDict->SetAt("CreationDate", new CPDF_String(DateStr, FALSE));
     pInfoDict->SetAt("Creator", new CPDF_String(L"PDFium"));
   }
 
@@ -273,7 +273,7 @@
     CPDF_Array* pRectArray = NULL;
     pRectArray = pAnnot->GetAnnotDict()->GetArray("Rect");
     if (!pRectArray)
-      pRectArray = CPDF_Array::Create();
+      pRectArray = new CPDF_Array;
     pRectArray->SetAt(0, new CPDF_Number(rect.left));
     pRectArray->SetAt(1, new CPDF_Number(rect.bottom));
     pRectArray->SetAt(2, new CPDF_Number(rect.right));
diff --git a/fpdfsdk/src/fpdfppo.cpp b/fpdfsdk/src/fpdfppo.cpp
index 513ffc4..2fce7ad 100644
--- a/fpdfsdk/src/fpdfppo.cpp
+++ b/fpdfsdk/src/fpdfppo.cpp
@@ -43,17 +43,16 @@
   if (!pNewRoot)
     return FALSE;
 
-  // Set the document information////////////////////////////////////////////
-
+  // Set the document information
   CPDF_Dictionary* DInfoDict = pDestPDFDoc->GetInfo();
   if (!DInfoDict)
     return FALSE;
 
   CFX_ByteString producerstr;
   producerstr.Format("PDFium");
-  DInfoDict->SetAt("Producer", new CPDF_String(producerstr));
+  DInfoDict->SetAt("Producer", new CPDF_String(producerstr, FALSE));
 
-  // Set type////////////////////////////////////////////////////////////////
+  // Set type
   CFX_ByteString cbRootType = pNewRoot->GetString("Type", "");
   if (cbRootType.Equal("")) {
     pNewRoot->SetAt("Type", new CPDF_Name("Catalog"));
@@ -100,7 +99,7 @@
     if (!pSrcPageDict || !pCurPageDict)
       return FALSE;
 
-    // Clone the page dictionary///////////
+    // Clone the page dictionary
     FX_POSITION SrcPos = pSrcPageDict->GetStartPos();
     while (SrcPos) {
       CFX_ByteString cbSrcKeyStr;
@@ -112,7 +111,7 @@
       }
     }
 
-    // inheritable item///////////////////////
+    // inheritable item
     CPDF_Object* pInheritable = nullptr;
     // 1 MediaBox  //required
     if (!pCurPageDict->KeyExist("MediaBox")) {
@@ -156,7 +155,6 @@
         pCurPageDict->SetAt("Rotate", pInheritable->Clone());
     }
 
-    /////////////////////////////////////////////
     // Update the reference
     FX_DWORD dwOldPageObj = pSrcPageDict->GetObjNum();
     FX_DWORD dwNewPageObj = pCurPageDict->GetObjNum();
