diff --git a/xfa/fde/cfde_txtedtbuf.cpp b/xfa/fde/cfde_txtedtbuf.cpp
index 7af5a18..58f1822 100644
--- a/xfa/fde/cfde_txtedtbuf.cpp
+++ b/xfa/fde/cfde_txtedtbuf.cpp
@@ -16,17 +16,12 @@
 }  // namespace
 
 CFDE_TxtEdtBuf::CFDE_TxtEdtBuf()
-    : m_nChunkSize(kDefaultChunkSize),
-      m_nTotal(0),
-      m_bChanged(FALSE),
-      m_pAllocator(nullptr) {
-  ASSERT(m_nChunkSize);
+    : m_nChunkSize(kDefaultChunkSize), m_nTotal(0), m_bChanged(FALSE) {
   ResetChunkBuffer(kDefaultChunkCount, m_nChunkSize);
 }
 
 CFDE_TxtEdtBuf::~CFDE_TxtEdtBuf() {
   Clear(TRUE);
-  delete m_pAllocator;
   m_Chunks.RemoveAll();
 }
 
@@ -271,8 +266,6 @@
                                       int32_t nChunkSize) {
   ASSERT(nChunkSize);
   ASSERT(nDefChunkCount);
-  delete m_pAllocator;
-  m_pAllocator = nullptr;
   m_Chunks.RemoveAll();
   m_nChunkSize = nChunkSize;
   int32_t nChunkLength =
diff --git a/xfa/fde/cfde_txtedtbuf.h b/xfa/fde/cfde_txtedtbuf.h
index e871ed9..baf67ce 100644
--- a/xfa/fde/cfde_txtedtbuf.h
+++ b/xfa/fde/cfde_txtedtbuf.h
@@ -7,6 +7,8 @@
 #ifndef XFA_FDE_CFDE_TXTEDTBUF_H_
 #define XFA_FDE_CFDE_TXTEDTBUF_H_
 
+#include <memory>
+
 #include "core/fxcrt/include/fx_basic.h"
 #include "core/fxcrt/include/fx_system.h"
 
@@ -55,7 +57,7 @@
   int32_t m_nTotal;
   FX_BOOL m_bChanged;
   CFX_ArrayTemplate<FDE_CHUNKHEADER*> m_Chunks;
-  IFX_MemoryAllocator* m_pAllocator;
+  std::unique_ptr<IFX_MemoryAllocator> m_pAllocator;
 };
 
 #endif  // XFA_FDE_CFDE_TXTEDTBUF_H_
diff --git a/xfa/fde/cfde_txtedtengine.cpp b/xfa/fde/cfde_txtedtengine.cpp
index 8c950f5..e7da157 100644
--- a/xfa/fde/cfde_txtedtengine.cpp
+++ b/xfa/fde/cfde_txtedtengine.cpp
@@ -50,7 +50,7 @@
 FDE_TXTEDT_TEXTCHANGE_INFO::~FDE_TXTEDT_TEXTCHANGE_INFO() {}
 
 CFDE_TxtEdtEngine::CFDE_TxtEdtEngine()
-    : m_pTextBreak(nullptr),
+    : m_pTxtBuf(new CFDE_TxtEdtBuf()),
       m_nPageLineCount(20),
       m_nLineCount(0),
       m_nAnchorPos(-1),
@@ -67,13 +67,10 @@
       m_bAutoLineEnd(TRUE),
       m_wLineEnd(kUnicodeParagraphSeparator) {
   FXSYS_memset(&m_rtCaret, 0, sizeof(CFX_RectF));
-  m_pTxtBuf = new CFDE_TxtEdtBuf();
   m_bAutoLineEnd = (m_Param.nLineEnd == FDE_TXTEDIT_LINEEND_Auto);
 }
 
 CFDE_TxtEdtEngine::~CFDE_TxtEdtEngine() {
-  delete m_pTxtBuf;
-  delete m_pTextBreak;
   RemoveAllParags();
   RemoveAllPages();
   m_Param.pEventSink = nullptr;
@@ -82,7 +79,7 @@
 
 void CFDE_TxtEdtEngine::SetEditParams(const FDE_TXTEDTPARAMS& params) {
   if (!m_pTextBreak)
-    m_pTextBreak = new CFX_TxtBreak(FX_TXTBREAKPOLICY_None);
+    m_pTextBreak.reset(new CFX_TxtBreak(FX_TXTBREAKPOLICY_None));
 
   FXSYS_memcpy(&m_Param, &params, sizeof(FDE_TXTEDTPARAMS));
   m_wLineEnd = params.wLineBreakChar;
@@ -727,7 +724,7 @@
 }
 
 CFDE_TxtEdtBuf* CFDE_TxtEdtEngine::GetTextBuf() const {
-  return m_pTxtBuf;
+  return m_pTxtBuf.get();
 }
 
 int32_t CFDE_TxtEdtEngine::GetTextBufLength() const {
@@ -735,7 +732,7 @@
 }
 
 CFX_TxtBreak* CFDE_TxtEdtEngine::GetTextBreak() const {
-  return m_pTextBreak;
+  return m_pTextBreak.get();
 }
 
 int32_t CFDE_TxtEdtEngine::GetLineCount() const {
@@ -755,10 +752,9 @@
 }
 
 IFX_CharIter* CFDE_TxtEdtEngine::CreateCharIter() {
-  if (!m_pTxtBuf) {
+  if (!m_pTxtBuf)
     return nullptr;
-  }
-  return new CFDE_TxtEdtBufIter(static_cast<CFDE_TxtEdtBuf*>(m_pTxtBuf));
+  return new CFDE_TxtEdtBufIter(m_pTxtBuf.get());
 }
 
 int32_t CFDE_TxtEdtEngine::Line2Parag(int32_t nStartParag,
@@ -986,8 +982,7 @@
   FX_WCHAR wChar = L' ';
   int32_t nParagStart = 0;
   int32_t nIndex = 0;
-  std::unique_ptr<IFX_CharIter> pIter(
-      new CFDE_TxtEdtBufIter(static_cast<CFDE_TxtEdtBuf*>(m_pTxtBuf)));
+  std::unique_ptr<IFX_CharIter> pIter(new CFDE_TxtEdtBufIter(m_pTxtBuf.get()));
   pIter->SetAt(0);
   do {
     wChar = pIter->GetChar();
diff --git a/xfa/fde/cfde_txtedtengine.h b/xfa/fde/cfde_txtedtengine.h
index 4bafce6..9749139 100644
--- a/xfa/fde/cfde_txtedtengine.h
+++ b/xfa/fde/cfde_txtedtengine.h
@@ -7,6 +7,8 @@
 #ifndef XFA_FDE_CFDE_TXTEDTENGINE_H_
 #define XFA_FDE_CFDE_TXTEDTENGINE_H_
 
+#include <memory>
+
 #include "xfa/fde/ifde_txtedtengine.h"
 
 class CFDE_TxtEdtBuf;
@@ -150,8 +152,8 @@
   FX_BOOL IsSelect();
   void DeleteSelect();
 
-  CFDE_TxtEdtBuf* m_pTxtBuf;
-  CFX_TxtBreak* m_pTextBreak;
+  std::unique_ptr<CFDE_TxtEdtBuf> m_pTxtBuf;
+  std::unique_ptr<CFX_TxtBreak> m_pTextBreak;
   FDE_TXTEDTPARAMS m_Param;
   CFX_ArrayTemplate<IFDE_TxtEdtPage*> m_PagePtrArray;
   CFX_ArrayTemplate<CFDE_TxtEdtParag*> m_ParagPtrArray;
diff --git a/xfa/fde/cfde_txtedtpage.cpp b/xfa/fde/cfde_txtedtpage.cpp
index a31997f..2142099 100644
--- a/xfa/fde/cfde_txtedtpage.cpp
+++ b/xfa/fde/cfde_txtedtpage.cpp
@@ -29,7 +29,7 @@
 }
 
 CFDE_TxtEdtPage::CFDE_TxtEdtPage(CFDE_TxtEdtEngine* pEngine, int32_t nPageIndex)
-    : m_pTextSet(nullptr),
+    : m_pEditEngine(pEngine),
       m_PieceMassArr(100),
       m_pBgnParag(nullptr),
       m_pEndParag(nullptr),
@@ -37,19 +37,15 @@
       m_nPageStart(-1),
       m_nCharCount(0),
       m_nPageIndex(nPageIndex),
-      m_bLoaded(FALSE),
-      m_pCharWidth(nullptr) {
+      m_bLoaded(FALSE) {
   FXSYS_memset(&m_rtPage, 0, sizeof(CFX_RectF));
   FXSYS_memset(&m_rtPageMargin, 0, sizeof(CFX_RectF));
   FXSYS_memset(&m_rtPageContents, 0, sizeof(CFX_RectF));
   FXSYS_memset(&m_rtPageCanvas, 0, sizeof(CFX_RectF));
-  m_pEditEngine = static_cast<CFDE_TxtEdtEngine*>(pEngine);
 }
 
 CFDE_TxtEdtPage::~CFDE_TxtEdtPage() {
   m_PieceMassArr.RemoveAll(TRUE);
-  delete m_pTextSet;
-  delete[] m_pCharWidth;
 }
 
 CFDE_TxtEdtEngine* CFDE_TxtEdtPage::GetEngine() const {
@@ -308,14 +304,13 @@
       (bVertial && bLineReserve) ? (-pParams->fLineSpace) : pParams->fLineSpace;
   FX_FLOAT fLinePos = fLineStart;
   if (!m_pTextSet)
-    m_pTextSet = new CFDE_TxtEdtTextSet(this);
+    m_pTextSet.reset(new CFDE_TxtEdtTextSet(this));
 
   m_PieceMassArr.RemoveAll(TRUE);
   uint32_t dwBreakStatus = FX_TXTBREAK_None;
   int32_t nPieceStart = 0;
-  delete[] m_pCharWidth;
 
-  m_pCharWidth = new int32_t[nPageEnd - nPageStart + 1];
+  m_CharWidths.resize(nPageEnd - nPageStart + 1, 0);
   pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
   pBreak->ClearBreakPieces();
   m_nPageStart = nPageStart;
@@ -394,7 +389,7 @@
         m_PieceMassArr.Add(TxtEdtPiece);
         for (int32_t k = 0; k < TxtEdtPiece.nCount; k++) {
           CFX_Char* ptc = pPiece->GetCharPtr(k);
-          m_pCharWidth[TxtEdtPiece.nStart + k] = ptc->m_iCharWidth;
+          m_CharWidths[TxtEdtPiece.nStart + k] = ptc->m_iCharWidth;
         }
       }
       fLinePos += fLineStep;
@@ -448,10 +443,8 @@
     return;
 
   m_PieceMassArr.RemoveAll(FALSE);
-  delete m_pTextSet;
-  m_pTextSet = nullptr;
-  delete[] m_pCharWidth;
-  m_pCharWidth = nullptr;
+  m_pTextSet.reset();
+  m_CharWidths.clear();
   if (m_pBgnParag) {
     m_pBgnParag->UnloadParag();
     m_pBgnParag = nullptr;
@@ -480,7 +473,7 @@
     return nullptr;
   }
   int32_t nPos = (int32_t)(uintptr_t)pos;
-  pVisualSet = m_pTextSet;
+  pVisualSet = m_pTextSet.get();
   if (nPos + 1 > m_PieceMassArr.GetSize()) {
     pos = nullptr;
   } else {
@@ -502,7 +495,7 @@
 
 int32_t CFDE_TxtEdtPage::GetWidth(const FDE_TEXTEDITPIECE* pIdentity,
                                   int32_t index) const {
-  int32_t nWidth = m_pCharWidth[pIdentity->nStart + index];
+  int32_t nWidth = m_CharWidths[pIdentity->nStart + index];
   return nWidth;
 }
 
diff --git a/xfa/fde/cfde_txtedtpage.h b/xfa/fde/cfde_txtedtpage.h
index 9adaee1..777f829 100644
--- a/xfa/fde/cfde_txtedtpage.h
+++ b/xfa/fde/cfde_txtedtpage.h
@@ -7,6 +7,9 @@
 #ifndef XFA_FDE_CFDE_TXTEDTPAGE_H_
 #define XFA_FDE_CFDE_TXTEDTPAGE_H_
 
+#include <memory>
+#include <vector>
+
 #include "xfa/fde/ifde_txtedtpage.h"
 #include "xfa/fde/ifx_chariter.h"
 
@@ -60,8 +63,8 @@
                         FX_FLOAT fTolerance) const;
 
   std::unique_ptr<IFX_CharIter> m_pIter;
-  CFDE_TxtEdtTextSet* m_pTextSet;
-  CFDE_TxtEdtEngine* m_pEditEngine;
+  std::unique_ptr<CFDE_TxtEdtTextSet> m_pTextSet;
+  CFDE_TxtEdtEngine* const m_pEditEngine;
   CFX_MassArrayTemplate<FDE_TEXTEDITPIECE> m_PieceMassArr;
   CFDE_TxtEdtParag* m_pBgnParag;
   CFDE_TxtEdtParag* m_pEndParag;
@@ -74,7 +77,7 @@
   CFX_RectF m_rtPageMargin;
   CFX_RectF m_rtPageContents;
   CFX_RectF m_rtPageCanvas;
-  int32_t* m_pCharWidth;
+  std::vector<int32_t> m_CharWidths;
 };
 
 #endif  // XFA_FDE_CFDE_TXTEDTPAGE_H_
diff --git a/xfa/fde/css/fde_cssstyleselector.cpp b/xfa/fde/css/fde_cssstyleselector.cpp
index 6a1a0b0..b68ace8 100644
--- a/xfa/fde/css/fde_cssstyleselector.cpp
+++ b/xfa/fde/css/fde_cssstyleselector.cpp
@@ -27,6 +27,7 @@
   }
   return -1;
 }
+
 void CFDE_CSSCounterStyle::DoUpdateIndex(IFDE_CSSValueList* pList) {
   if (!pList)
     return;
@@ -105,13 +106,8 @@
   }
 }
 
-CFDE_CSSStyleSelector::CFDE_CSSStyleSelector()
-    : m_pFontMgr(nullptr),
-      m_fDefFontSize(12.0f),
-      m_pRuleDataStore(nullptr),
-      m_pInlineStyleStore(nullptr),
-      m_pFixedStyleStore(nullptr),
-      m_pAccelerator(nullptr) {
+CFDE_CSSStyleSelector::CFDE_CSSStyleSelector(IFGAS_FontMgr* pFontMgr)
+    : m_pFontMgr(pFontMgr), m_fDefFontSize(12.0f) {
   m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_High] = FDE_CSSSTYLESHEETGROUP_Author;
   m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_Mid] = FDE_CSSSTYLESHEETGROUP_User;
   m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_Low] =
@@ -120,14 +116,8 @@
 
 CFDE_CSSStyleSelector::~CFDE_CSSStyleSelector() {
   Reset();
-  delete m_pInlineStyleStore;
-  delete m_pFixedStyleStore;
-  delete m_pAccelerator;
 }
 
-void CFDE_CSSStyleSelector::SetFontMgr(IFGAS_FontMgr* pFontMgr) {
-  m_pFontMgr = pFontMgr;
-}
 void CFDE_CSSStyleSelector::SetDefFontSize(FX_FLOAT fFontSize) {
   ASSERT(fFontSize > 0);
   m_fDefFontSize = fFontSize;
@@ -135,9 +125,9 @@
 
 CFDE_CSSAccelerator* CFDE_CSSStyleSelector::InitAccelerator() {
   if (!m_pAccelerator)
-    m_pAccelerator = new CFDE_CSSAccelerator;
+    m_pAccelerator.reset(new CFDE_CSSAccelerator);
   m_pAccelerator->Clear();
-  return m_pAccelerator;
+  return m_pAccelerator.get();
 }
 
 IFDE_CSSComputedStyle* CFDE_CSSStyleSelector::CreateComputedStyle(
@@ -146,8 +136,8 @@
     m_pFixedStyleStore = IFX_MemoryAllocator::Create(
         FX_ALLOCTYPE_Fixed, 16, sizeof(CFDE_CSSComputedStyle));
   }
-  CFDE_CSSComputedStyle* pStyle = FXTARGET_NewWith(m_pFixedStyleStore)
-      CFDE_CSSComputedStyle(m_pFixedStyleStore);
+  CFDE_CSSComputedStyle* pStyle = FXTARGET_NewWith(m_pFixedStyleStore.get())
+      CFDE_CSSComputedStyle(m_pFixedStyleStore.get());
   if (pParentStyle) {
     pStyle->m_InheritedData =
         static_cast<CFDE_CSSComputedStyle*>(pParentStyle)->m_InheritedData;
@@ -157,6 +147,7 @@
   pStyle->m_NonInheritedData.Reset();
   return pStyle;
 }
+
 FX_BOOL CFDE_CSSStyleSelector::SetStyleSheet(FDE_CSSSTYLESHEETGROUP eType,
                                              IFDE_CSSStyleSheet* pSheet) {
   ASSERT(eType < FDE_CSSSTYLESHEETGROUP_MAX);
@@ -166,6 +157,7 @@
     dest.Add(pSheet);
   return TRUE;
 }
+
 FX_BOOL CFDE_CSSStyleSelector::SetStyleSheets(
     FDE_CSSSTYLESHEETGROUP eType,
     const CFDE_CSSStyleSheetArray* pArray) {
@@ -177,27 +169,30 @@
     dest.RemoveAt(0, dest.GetSize());
   return TRUE;
 }
+
 void CFDE_CSSStyleSelector::SetStylePriority(
     FDE_CSSSTYLESHEETGROUP eType,
     FDE_CSSSTYLESHEETPRIORITY ePriority) {
   m_ePriorities[ePriority] = eType;
 }
+
 void CFDE_CSSStyleSelector::UpdateStyleIndex(uint32_t dwMediaList) {
   Reset();
   m_pRuleDataStore = IFX_MemoryAllocator::Create(FX_ALLOCTYPE_Static, 1024, 0);
   for (int32_t iGroup = 0; iGroup < FDE_CSSSTYLESHEETGROUP_MAX; ++iGroup) {
     CFDE_CSSRuleCollection& rules = m_RuleCollection[iGroup];
-    rules.m_pStaticStore = m_pRuleDataStore;
+    rules.m_pStaticStore = m_pRuleDataStore.get();
     rules.AddRulesFrom(m_SheetGroups[iGroup], dwMediaList, m_pFontMgr);
   }
 }
+
 void CFDE_CSSStyleSelector::Reset() {
   for (int32_t iGroup = 0; iGroup < FDE_CSSSTYLESHEETGROUP_MAX; ++iGroup) {
     m_RuleCollection[iGroup].Clear();
   }
-  delete m_pRuleDataStore;
-  m_pRuleDataStore = nullptr;
+  m_pRuleDataStore.reset();
 }
+
 int32_t CFDE_CSSStyleSelector::MatchDeclarations(
     CXFA_CSSTagProvider* pTag,
     CFDE_CSSDeclarationArray& matchedDecls,
@@ -325,16 +320,18 @@
       uint32_t dwAttriHash = FX_HashCode_GetW(wsAttri.AsStringC(), true);
       if (dwAttriHash == s_dwStyleHash) {
         if (!pDecl)
-          pDecl = FXTARGET_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration;
+          pDecl =
+              FXTARGET_NewWith(m_pInlineStyleStore.get()) CFDE_CSSDeclaration;
 
         AppendInlineStyle(pDecl, wsValue.c_str(), wsValue.GetLength());
       } else if (dwAttriHash == s_dwAlignHash) {
         if (!pDecl)
-          pDecl = FXTARGET_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration;
+          pDecl =
+              FXTARGET_NewWith(m_pInlineStyleStore.get()) CFDE_CSSDeclaration;
 
         FDE_CSSPROPERTYARGS args;
         args.pStringCache = nullptr;
-        args.pStaticStore = m_pInlineStyleStore;
+        args.pStaticStore = m_pInlineStyleStore.get();
         args.pProperty = FDE_GetCSSPropertyByEnum(FDE_CSSPROPERTY_TextAlign);
         pDecl->AddProperty(&args, wsValue.c_str(), wsValue.GetLength());
       }
@@ -431,6 +428,7 @@
     }
   }
 }
+
 void CFDE_CSSStyleSelector::AppendInlineStyle(CFDE_CSSDeclaration* pDecl,
                                               const FX_WCHAR* psz,
                                               int32_t iLen) {
@@ -443,7 +441,7 @@
   const FX_WCHAR* psz2;
   FDE_CSSPROPERTYARGS args;
   args.pStringCache = nullptr;
-  args.pStaticStore = m_pInlineStyleStore;
+  args.pStaticStore = m_pInlineStyleStore.get();
   args.pProperty = nullptr;
   CFX_WideString wsName;
   while (1) {
@@ -1016,6 +1014,7 @@
     ASSERT(FALSE);
   }
 }
+
 FX_FLOAT CFDE_CSSStyleSelector::ApplyNumber(FDE_CSSPRIMITIVETYPE eUnit,
                                             FX_FLOAT fValue,
                                             FX_FLOAT fPercentBase) {
@@ -1042,6 +1041,7 @@
       return fValue;
   }
 }
+
 FDE_CSSRUBYSPAN CFDE_CSSStyleSelector::ToRubySpan(FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
     case FDE_CSSPROPERTYVALUE_None:
@@ -1049,6 +1049,7 @@
       return FDE_CSSRUBYSPAN_None;
   }
 }
+
 FDE_CSSRUBYPOSITION CFDE_CSSStyleSelector::ToRubyPosition(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1064,6 +1065,7 @@
       return FDE_CSSRUBYPOSITION_Before;
   }
 }
+
 FDE_CSSRUBYOVERHANG CFDE_CSSStyleSelector::ToRubyOverhang(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1078,6 +1080,7 @@
       return FDE_CSSRUBYOVERHANG_None;
   }
 }
+
 FDE_CSSRUBYALIGN CFDE_CSSStyleSelector::ToRubyAlign(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1103,6 +1106,7 @@
       return FDE_CSSRUBYALIGN_Auto;
   }
 }
+
 FX_BOOL CFDE_CSSStyleSelector::ToTextEmphasisMark(
     FDE_CSSPROPERTYVALUE eValue,
     FDE_CSSTEXTEMPHASISMARK& eMark) {
@@ -1129,6 +1133,7 @@
       return FALSE;
   }
 }
+
 FX_BOOL CFDE_CSSStyleSelector::ToTextEmphasisFill(
     FDE_CSSPROPERTYVALUE eValue,
     FDE_CSSTEXTEMPHASISFILL& eFill) {
@@ -1143,6 +1148,7 @@
       return FALSE;
   }
 }
+
 FDE_CSSBKGATTACHMENT CFDE_CSSStyleSelector::ToBKGAttachment(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1154,6 +1160,7 @@
       return FDE_CSSBKGATTACHMENT_Fixed;
   }
 }
+
 FDE_CSSCAPTIONSIDE CFDE_CSSStyleSelector::ToCaptionSide(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1173,6 +1180,7 @@
       return FDE_CSSCAPTIONSIDE_Top;
   }
 }
+
 FDE_CSSPOSITION CFDE_CSSStyleSelector::ToPosition(FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
     case FDE_CSSPROPERTYVALUE_Static:
@@ -1187,6 +1195,7 @@
       return FDE_CSSPOSITION_Static;
   }
 }
+
 FDE_CSSCURSOR CFDE_CSSStyleSelector::ToCursor(FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
     case FDE_CSSPROPERTYVALUE_Auto:
@@ -1215,6 +1224,7 @@
       return FDE_CSSCURSOR_Auto;
   }
 }
+
 FDE_CSSBKGREPEAT CFDE_CSSStyleSelector::ToBKGRepeat(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1230,6 +1240,7 @@
       return FDE_CSSBKGREPEAT_Repeat;
   }
 }
+
 FDE_CSSTEXTCOMBINE CFDE_CSSStyleSelector::ToTextCombine(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1240,6 +1251,7 @@
       return FDE_CSSTEXTCOMBINE_None;
   }
 }
+
 FDE_CSSLINEBREAK CFDE_CSSStyleSelector::ToLineBreak(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1255,6 +1267,7 @@
       return FDE_CSSLINEBREAK_Auto;
   }
 }
+
 FDE_CSSOVERFLOW CFDE_CSSStyleSelector::ToOverflow(FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
     case FDE_CSSPROPERTYVALUE_Visible:
@@ -1273,6 +1286,7 @@
       return FDE_CSSOVERFLOW_Visible;
   }
 }
+
 FDE_CSSWRITINGMODE CFDE_CSSStyleSelector::ToWritingMode(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1286,6 +1300,7 @@
       return FDE_CSSWRITINGMODE_HorizontalTb;
   }
 }
+
 FDE_CSSWORDBREAK CFDE_CSSStyleSelector::ToWordBreak(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1301,6 +1316,7 @@
       return FDE_CSSWORDBREAK_Normal;
   }
 }
+
 FDE_CSSFLOAT CFDE_CSSStyleSelector::ToFloat(FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
     case FDE_CSSPROPERTYVALUE_Left:
@@ -1313,6 +1329,7 @@
       return FDE_CSSFLOAT_None;
   }
 }
+
 FDE_CSSCLEAR CFDE_CSSStyleSelector::ToClear(FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
     case FDE_CSSPROPERTYVALUE_None:
@@ -1327,6 +1344,7 @@
       return FDE_CSSCLEAR_None;
   }
 }
+
 FDE_CSSPAGEBREAK CFDE_CSSStyleSelector::ToPageBreak(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1344,6 +1362,7 @@
       return FDE_CSSPAGEBREAK_Auto;
   }
 }
+
 FDE_CSSDISPLAY CFDE_CSSStyleSelector::ToDisplay(FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
     case FDE_CSSPROPERTYVALUE_Inline:
@@ -1392,6 +1411,7 @@
       return FDE_CSSDISPLAY_Inline;
   }
 }
+
 FDE_CSSTEXTALIGN CFDE_CSSStyleSelector::ToTextAlign(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1407,6 +1427,7 @@
       return FDE_CSSTEXTALIGN_Left;
   }
 }
+
 uint16_t CFDE_CSSStyleSelector::ToFontWeight(FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
     case FDE_CSSPROPERTYVALUE_Normal:
@@ -1421,6 +1442,7 @@
       return 400;
   }
 }
+
 FDE_CSSFONTSTYLE CFDE_CSSStyleSelector::ToFontStyle(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1431,6 +1453,7 @@
       return FDE_CSSFONTSTYLE_Normal;
   }
 }
+
 FDE_CSSBORDERSTYLE CFDE_CSSStyleSelector::ToBorderStyle(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1458,6 +1481,7 @@
       return FDE_CSSBORDERSTYLE_None;
   }
 }
+
 FX_BOOL CFDE_CSSStyleSelector::SetLengthWithPercent(
     FDE_CSSLENGTH& width,
     FDE_CSSPRIMITIVETYPE eType,
@@ -1494,6 +1518,7 @@
   }
   return FALSE;
 }
+
 FX_FLOAT CFDE_CSSStyleSelector::ToFontSize(FDE_CSSPROPERTYVALUE eValue,
                                            FX_FLOAT fCurFontSize) {
   switch (eValue) {
@@ -1519,6 +1544,7 @@
       return fCurFontSize;
   }
 }
+
 FDE_CSSVERTICALALIGN CFDE_CSSStyleSelector::ToVerticalAlign(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1542,6 +1568,7 @@
       return FDE_CSSVERTICALALIGN_Baseline;
   }
 }
+
 FDE_CSSLISTSTYLETYPE CFDE_CSSStyleSelector::ToListStyleType(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1591,12 +1618,14 @@
       return FDE_CSSLISTSTYLETYPE_Disc;
   }
 }
+
 FDE_CSSLISTSTYLEPOSITION CFDE_CSSStyleSelector::ToListStylePosition(
     FDE_CSSPROPERTYVALUE eValue) {
   return eValue == FDE_CSSPROPERTYVALUE_Inside
              ? FDE_CSSLISTSTYLEPOSITION_Inside
              : FDE_CSSLISTSTYLEPOSITION_Outside;
 }
+
 FDE_CSSVISIBILITY CFDE_CSSStyleSelector::ToVisibility(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1610,6 +1639,7 @@
       return FDE_CSSVISIBILITY_Visible;
   }
 }
+
 FDE_CSSWHITESPACE CFDE_CSSStyleSelector::ToWhiteSpace(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1627,6 +1657,7 @@
       return FDE_CSSWHITESPACE_Normal;
   }
 }
+
 uint32_t CFDE_CSSStyleSelector::ToTextDecoration(IFDE_CSSValueList* pValue) {
   uint32_t dwDecoration = 0;
   for (int32_t i = pValue->CountValues() - 1; i >= 0; --i) {
@@ -1656,6 +1687,7 @@
   }
   return dwDecoration;
 }
+
 FDE_CSSTEXTTRANSFORM CFDE_CSSStyleSelector::ToTextTransform(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1671,6 +1703,7 @@
       return FDE_CSSTEXTTRANSFORM_None;
   }
 }
+
 FDE_CSSFONTVARIANT CFDE_CSSStyleSelector::ToFontVariant(
     FDE_CSSPROPERTYVALUE eValue) {
   return eValue == FDE_CSSPROPERTYVALUE_SmallCaps ? FDE_CSSFONTVARIANT_SmallCaps
diff --git a/xfa/fde/css/fde_cssstyleselector.h b/xfa/fde/css/fde_cssstyleselector.h
index 042e989..469712f 100644
--- a/xfa/fde/css/fde_cssstyleselector.h
+++ b/xfa/fde/css/fde_cssstyleselector.h
@@ -7,6 +7,7 @@
 #ifndef XFA_FDE_CSS_FDE_CSSSTYLESELECTOR_H_
 #define XFA_FDE_CSS_FDE_CSSSTYLESELECTOR_H_
 
+#include <memory>
 #include <vector>
 
 #include "core/fxcrt/include/fx_ext.h"
@@ -26,8 +27,8 @@
                   CFDE_CSSDeclaration* pDecl,
                   uint32_t dwPos);
 
-  CFDE_CSSSelector* pSelector;
-  CFDE_CSSDeclaration* pDeclaration;
+  CFDE_CSSSelector* const pSelector;
+  CFDE_CSSDeclaration* const pDeclaration;
   uint32_t dwPriority;
   FDE_CSSRuleData* pNext;
 };
@@ -88,10 +89,9 @@
 
 class CFDE_CSSStyleSelector : public CFX_Target {
  public:
-  CFDE_CSSStyleSelector();
+  explicit CFDE_CSSStyleSelector(IFGAS_FontMgr* pFontMgr);
   ~CFDE_CSSStyleSelector() override;
 
-  void SetFontMgr(IFGAS_FontMgr* pFontMgr);
   void SetDefFontSize(FX_FLOAT fFontSize);
 
   FX_BOOL SetStyleSheet(FDE_CSSSTYLESHEETGROUP eType,
@@ -174,15 +174,15 @@
   FDE_CSSRUBYPOSITION ToRubyPosition(FDE_CSSPROPERTYVALUE eValue);
   FDE_CSSRUBYSPAN ToRubySpan(FDE_CSSPROPERTYVALUE eValue);
 
-  IFGAS_FontMgr* m_pFontMgr;
+  IFGAS_FontMgr* const m_pFontMgr;
   FX_FLOAT m_fDefFontSize;
-  IFX_MemoryAllocator* m_pRuleDataStore;
+  std::unique_ptr<IFX_MemoryAllocator> m_pRuleDataStore;
   CFDE_CSSStyleSheetArray m_SheetGroups[FDE_CSSSTYLESHEETGROUP_MAX];
   CFDE_CSSRuleCollection m_RuleCollection[FDE_CSSSTYLESHEETGROUP_MAX];
   FDE_CSSSTYLESHEETGROUP m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_MAX];
-  IFX_MemoryAllocator* m_pInlineStyleStore;
-  IFX_MemoryAllocator* m_pFixedStyleStore;
-  CFDE_CSSAccelerator* m_pAccelerator;
+  std::unique_ptr<IFX_MemoryAllocator> m_pInlineStyleStore;
+  std::unique_ptr<IFX_MemoryAllocator> m_pFixedStyleStore;
+  std::unique_ptr<CFDE_CSSAccelerator> m_pAccelerator;
   std::vector<FDE_CSSRuleData*> m_MatchedRules;
 };
 
@@ -413,7 +413,7 @@
                       const CFX_WideString& wsValue);
 
   uint32_t m_dwRefCount;
-  IFX_MemoryAllocator* m_pAllocator;
+  IFX_MemoryAllocator* const m_pAllocator;
   CFDE_CSSInheritedData m_InheritedData;
   CFDE_CSSNonInheritedData m_NonInheritedData;
   CFX_WideStringArray m_CustomProperties;
diff --git a/xfa/fde/css/fde_cssstylesheet.cpp b/xfa/fde/css/fde_cssstylesheet.cpp
index 99beab8..bc94cc2 100644
--- a/xfa/fde/css/fde_cssstylesheet.cpp
+++ b/xfa/fde/css/fde_cssstylesheet.cpp
@@ -78,7 +78,6 @@
     : m_wCodePage(FX_CODEPAGE_UTF8),
       m_wRefCount(1),
       m_dwMediaList(dwMediaList),
-      m_pAllocator(nullptr),
       m_RuleArray(100) {
   ASSERT(m_dwMediaList > 0);
 }
@@ -108,8 +107,7 @@
   m_RuleArray.RemoveAll(FALSE);
   m_Selectors.RemoveAll();
   m_StringCache.clear();
-  delete m_pAllocator;
-  m_pAllocator = nullptr;
+  m_pAllocator.reset();
 }
 
 uint32_t CFDE_CSSStyleSheet::Retain() {
@@ -228,8 +226,8 @@
         break;
       case FDE_CSSSYNTAXSTATUS_DeclOpen:
         if ((dwMediaList & m_dwMediaList) > 0 && !pMediaRule) {
-          pMediaRule =
-              FXTARGET_NewWith(m_pAllocator) CFDE_CSSMediaRule(dwMediaList);
+          pMediaRule = FXTARGET_NewWith(m_pAllocator.get())
+              CFDE_CSSMediaRule(dwMediaList);
           m_RuleArray.Add(pMediaRule);
         }
         break;
@@ -248,7 +246,7 @@
   const FX_WCHAR* pszValue = nullptr;
   int32_t iValueLen = 0;
   FDE_CSSPROPERTYARGS propertyArgs;
-  propertyArgs.pStaticStore = m_pAllocator;
+  propertyArgs.pStaticStore = m_pAllocator.get();
   propertyArgs.pStringCache = &m_StringCache;
   propertyArgs.pProperty = nullptr;
   CFX_WideString wsName;
@@ -256,8 +254,8 @@
     switch (pSyntax->DoSyntaxParse()) {
       case FDE_CSSSYNTAXSTATUS_Selector: {
         pszValue = pSyntax->GetCurrentString(iValueLen);
-        CFDE_CSSSelector* pSelector =
-            CFDE_CSSSelector::FromString(m_pAllocator, pszValue, iValueLen);
+        CFDE_CSSSelector* pSelector = CFDE_CSSSelector::FromString(
+            m_pAllocator.get(), pszValue, iValueLen);
         if (pSelector)
           m_Selectors.Add(pSelector);
       } break;
@@ -286,8 +284,8 @@
         break;
       case FDE_CSSSYNTAXSTATUS_DeclOpen:
         if (!pStyleRule && m_Selectors.GetSize() > 0) {
-          pStyleRule = FXTARGET_NewWith(m_pAllocator) CFDE_CSSStyleRule;
-          pStyleRule->SetSelector(m_pAllocator, m_Selectors);
+          pStyleRule = FXTARGET_NewWith(m_pAllocator.get()) CFDE_CSSStyleRule;
+          pStyleRule->SetSelector(m_pAllocator.get(), m_Selectors);
           ruleArray.Add(pStyleRule);
         } else {
           SkipRuleSet(pSyntax);
@@ -312,7 +310,7 @@
   const FX_WCHAR* pszValue = nullptr;
   int32_t iValueLen = 0;
   FDE_CSSPROPERTYARGS propertyArgs;
-  propertyArgs.pStaticStore = m_pAllocator;
+  propertyArgs.pStaticStore = m_pAllocator.get();
   propertyArgs.pStringCache = &m_StringCache;
   propertyArgs.pProperty = nullptr;
   for (;;) {
@@ -333,7 +331,8 @@
         break;
       case FDE_CSSSYNTAXSTATUS_DeclOpen:
         if (!pFontFaceRule) {
-          pFontFaceRule = FXTARGET_NewWith(m_pAllocator) CFDE_CSSFontFaceRule;
+          pFontFaceRule =
+              FXTARGET_NewWith(m_pAllocator.get()) CFDE_CSSFontFaceRule;
           ruleArray.Add(pFontFaceRule);
         }
         break;
diff --git a/xfa/fde/css/fde_cssstylesheet.h b/xfa/fde/css/fde_cssstylesheet.h
index d4781f8..b013e2d 100644
--- a/xfa/fde/css/fde_cssstylesheet.h
+++ b/xfa/fde/css/fde_cssstylesheet.h
@@ -7,6 +7,7 @@
 #ifndef XFA_FDE_CSS_FDE_CSSSTYLESHEET_H_
 #define XFA_FDE_CSS_FDE_CSSSTYLESHEET_H_
 
+#include <memory>
 #include <unordered_map>
 
 #include "core/fxcrt/include/fx_ext.h"
@@ -133,7 +134,7 @@
   uint16_t m_wCodePage;
   uint16_t m_wRefCount;
   uint32_t m_dwMediaList;
-  IFX_MemoryAllocator* m_pAllocator;
+  std::unique_ptr<IFX_MemoryAllocator> m_pAllocator;
   CFX_MassArrayTemplate<IFDE_CSSRule*> m_RuleArray;
   CFX_WideString m_szUrl;
   CFX_ArrayTemplate<CFDE_CSSSelector*> m_Selectors;
diff --git a/xfa/fde/fde_gedevice.cpp b/xfa/fde/fde_gedevice.cpp
index 56f845c..3612966 100644
--- a/xfa/fde/fde_gedevice.cpp
+++ b/xfa/fde/fde_gedevice.cpp
@@ -17,7 +17,6 @@
                                      FX_BOOL bOwnerDevice)
     : m_pDevice(pDevice),
       m_bOwnerDevice(bOwnerDevice),
-      m_pCharPos(nullptr),
       m_iCharCount(0) {
   ASSERT(pDevice);
 
@@ -27,7 +26,6 @@
 }
 
 CFDE_RenderDevice::~CFDE_RenderDevice() {
-  FX_Free(m_pCharPos);
   if (m_bOwnerDevice)
     delete m_pDevice;
 }
diff --git a/xfa/fde/fde_gedevice.h b/xfa/fde/fde_gedevice.h
index 2d2a901..bb06cf6 100644
--- a/xfa/fde/fde_gedevice.h
+++ b/xfa/fde/fde_gedevice.h
@@ -116,10 +116,9 @@
                     FX_FLOAT fPenWidth,
                     CFX_GraphStateData& graphState);
 
-  CFX_RenderDevice* m_pDevice;
+  CFX_RenderDevice* const m_pDevice;
   CFX_RectF m_rtClip;
   FX_BOOL m_bOwnerDevice;
-  FXTEXT_CHARPOS* m_pCharPos;
   int32_t m_iCharCount;
 };
 
diff --git a/xfa/fde/fde_render.cpp b/xfa/fde/fde_render.cpp
index e2c395e..f3189b0 100644
--- a/xfa/fde/fde_render.cpp
+++ b/xfa/fde/fde_render.cpp
@@ -16,9 +16,7 @@
 CFDE_RenderContext::CFDE_RenderContext()
     : m_eStatus(FDE_RENDERSTATUS_Reset),
       m_pRenderDevice(nullptr),
-      m_Transform(),
-      m_pCharPos(nullptr),
-      m_iCharPosCount(0) {
+      m_Transform() {
   m_Transform.SetIdentity();
 }
 
@@ -101,9 +99,7 @@
   m_Transform.SetIdentity();
   m_pIterator.reset();
   m_pBrush.reset();
-  FX_Free(m_pCharPos);
-  m_pCharPos = nullptr;
-  m_iCharPosCount = 0;
+  m_CharPos.clear();
 }
 
 void CFDE_RenderContext::RenderText(IFDE_TextSet* pTextSet,
@@ -122,19 +118,14 @@
   if (!m_pBrush)
     m_pBrush.reset(new CFDE_Brush);
 
-  if (!m_pCharPos)
-    m_pCharPos = FX_Alloc(FXTEXT_CHARPOS, iCount);
-  else if (m_iCharPosCount < iCount)
-    m_pCharPos = FX_Realloc(FXTEXT_CHARPOS, m_pCharPos, iCount);
+  if (m_CharPos.size() < static_cast<size_t>(iCount))
+    m_CharPos.resize(iCount, FXTEXT_CHARPOS());
 
-  if (m_iCharPosCount < iCount)
-    m_iCharPosCount = iCount;
-
-  iCount = pTextSet->GetDisplayPos(pText, m_pCharPos, FALSE);
+  iCount = pTextSet->GetDisplayPos(pText, m_CharPos.data(), FALSE);
   FX_FLOAT fFontSize = pTextSet->GetFontSize();
   FX_ARGB dwColor = pTextSet->GetFontColor();
   m_pBrush->SetColor(dwColor);
-  m_pRenderDevice->DrawString(m_pBrush.get(), pFont, m_pCharPos, iCount,
+  m_pRenderDevice->DrawString(m_pBrush.get(), pFont, m_CharPos.data(), iCount,
                               fFontSize, &m_Transform);
 }
 
diff --git a/xfa/fde/fde_render.h b/xfa/fde/fde_render.h
index 523aaee..b91bbfe 100644
--- a/xfa/fde/fde_render.h
+++ b/xfa/fde/fde_render.h
@@ -8,6 +8,7 @@
 #define XFA_FDE_FDE_RENDER_H_
 
 #include <memory>
+#include <vector>
 
 #include "core/fxcrt/include/fx_coordinates.h"
 #include "xfa/fde/fde_gedevice.h"
@@ -40,8 +41,7 @@
   FDE_RENDERSTATUS m_eStatus;
   CFDE_RenderDevice* m_pRenderDevice;
   CFX_Matrix m_Transform;
-  FXTEXT_CHARPOS* m_pCharPos;
-  int32_t m_iCharPosCount;
+  std::vector<FXTEXT_CHARPOS> m_CharPos;
   std::unique_ptr<CFDE_Brush> m_pBrush;
   std::unique_ptr<CFDE_VisualSetIterator> m_pIterator;
 };
diff --git a/xfa/fde/tto/fde_textout.cpp b/xfa/fde/tto/fde_textout.cpp
index a29a420..c83afc1 100644
--- a/xfa/fde/tto/fde_textout.cpp
+++ b/xfa/fde/tto/fde_textout.cpp
@@ -18,17 +18,14 @@
 #include "xfa/fgas/layout/fgas_textbreak.h"
 
 CFDE_TextOut::CFDE_TextOut()
-    : m_pFont(nullptr),
+    : m_pTxtBreak(new CFX_TxtBreak(FX_TXTBREAKPOLICY_None)),
+      m_pFont(nullptr),
       m_fFontSize(12.0f),
       m_fLineSpace(m_fFontSize),
       m_fLinePos(0.0f),
       m_fTolerance(0.0f),
       m_iAlignment(0),
       m_iTxtBkAlignment(0),
-      m_pCharWidths(nullptr),
-      m_iChars(0),
-      m_pEllCharWidths(nullptr),
-      m_iEllChars(0),
       m_wParagraphBkChar(L'\n'),
       m_TxtColor(0xFF000000),
       m_dwStyles(0),
@@ -38,34 +35,32 @@
       m_ttoLines(5),
       m_iCurLine(0),
       m_iCurPiece(0),
-      m_iTotalLines(0),
-      m_pCharPos(nullptr),
-      m_iCharPosSize(0) {
-  m_pTxtBreak = new CFX_TxtBreak(FX_TXTBREAKPOLICY_None);
+      m_iTotalLines(0) {
   m_Matrix.SetIdentity();
   m_rtClip.Reset();
   m_rtLogicClip.Reset();
 }
+
 CFDE_TextOut::~CFDE_TextOut() {
-  delete m_pTxtBreak;
-  FX_Free(m_pCharWidths);
-  FX_Free(m_pEllCharWidths);
-  FX_Free(m_pCharPos);
   m_ttoLines.RemoveAll(FALSE);
 }
+
 void CFDE_TextOut::SetFont(CFGAS_GEFont* pFont) {
   ASSERT(pFont);
   m_pFont = pFont;
   m_pTxtBreak->SetFont(pFont);
 }
+
 void CFDE_TextOut::SetFontSize(FX_FLOAT fFontSize) {
   ASSERT(fFontSize > 0);
   m_fFontSize = fFontSize;
   m_pTxtBreak->SetFontSize(fFontSize);
 }
+
 void CFDE_TextOut::SetTextColor(FX_ARGB color) {
   m_TxtColor = color;
 }
+
 void CFDE_TextOut::SetStyles(uint32_t dwStyles) {
   m_dwStyles = dwStyles;
   m_dwTxtBkStyles = 0;
@@ -90,18 +85,22 @@
   }
   m_pTxtBreak->SetLayoutStyles(m_dwTxtBkStyles);
 }
+
 void CFDE_TextOut::SetTabWidth(FX_FLOAT fTabWidth) {
   ASSERT(fTabWidth > 1.0f);
   m_pTxtBreak->SetTabWidth(fTabWidth, FALSE);
 }
+
 void CFDE_TextOut::SetEllipsisString(const CFX_WideString& wsEllipsis) {
   m_bElliChanged = TRUE;
   m_wsEllipsis = wsEllipsis;
 }
+
 void CFDE_TextOut::SetParagraphBreakChar(FX_WCHAR wch) {
   m_wParagraphBkChar = wch;
   m_pTxtBreak->SetParagraphBreakChar(wch);
 }
+
 void CFDE_TextOut::SetAlignment(int32_t iAlignment) {
   m_iAlignment = iAlignment;
   switch (m_iAlignment) {
@@ -121,6 +120,7 @@
   }
   m_pTxtBreak->SetAlignment(m_iTxtBkAlignment);
 }
+
 void CFDE_TextOut::SetLineSpace(FX_FLOAT fLineSpace) {
   ASSERT(fLineSpace > 1.0f);
   m_fLineSpace = fLineSpace;
@@ -144,22 +144,28 @@
   m_rtClip.Set((FX_FLOAT)rtClip.left, (FX_FLOAT)rtClip.top,
                (FX_FLOAT)rtClip.Width(), (FX_FLOAT)rtClip.Height());
 }
+
 void CFDE_TextOut::SetClipRect(const CFX_RectF& rtClip) {
   m_rtClip = rtClip;
 }
+
 void CFDE_TextOut::SetLogicClipRect(const CFX_RectF& rtClip) {
   m_rtLogicClip = rtClip;
 }
+
 void CFDE_TextOut::SetMatrix(const CFX_Matrix& matrix) {
   m_Matrix = matrix;
 }
+
 void CFDE_TextOut::SetLineBreakTolerance(FX_FLOAT fTolerance) {
   m_fTolerance = fTolerance;
   m_pTxtBreak->SetLineBreakTolerance(m_fTolerance);
 }
+
 int32_t CFDE_TextOut::GetTotalLines() {
   return m_iTotalLines;
 }
+
 void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
                             int32_t iLength,
                             CFX_Size& size) {
@@ -169,6 +175,7 @@
   size.x = (int32_t)rtText.Width();
   size.y = (int32_t)rtText.Height();
 }
+
 void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
                             int32_t iLength,
                             CFX_SizeF& size) {
@@ -178,6 +185,7 @@
   size.x = rtText.Width();
   size.y = rtText.Height();
 }
+
 void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
                             int32_t iLength,
                             CFX_Rect& rect) {
@@ -188,6 +196,7 @@
   rect.Set((int32_t)rtText.left, (int32_t)rtText.top, (int32_t)rtText.Width(),
            (int32_t)rtText.Height());
 }
+
 void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
                             int32_t iLength,
                             CFX_RectF& rect) {
@@ -202,6 +211,7 @@
     m_Matrix.TransformRect(rect);
   }
 }
+
 void CFDE_TextOut::CalcLogicSize(const FX_WCHAR* pwsStr,
                                  int32_t iLength,
                                  CFX_SizeF& size) {
@@ -211,6 +221,7 @@
   size.x = rtText.Width();
   size.y = rtText.Height();
 }
+
 void CFDE_TextOut::CalcLogicSize(const FX_WCHAR* pwsStr,
                                  int32_t iLength,
                                  CFX_RectF& rect) {
@@ -221,6 +232,7 @@
     CalcTextSize(pwsStr, iLength, rect);
   }
 }
+
 void CFDE_TextOut::CalcTextSize(const FX_WCHAR* pwsStr,
                                 int32_t iLength,
                                 CFX_RectF& rect) {
@@ -283,6 +295,7 @@
     }
   }
 }
+
 void CFDE_TextOut::SetLineWidth(CFX_RectF& rect) {
   if ((m_dwStyles & FDE_TTOSTYLE_SingleLine) == 0) {
     FX_FLOAT fLineWidth = 0.0f;
@@ -300,6 +313,7 @@
     m_pTxtBreak->SetLineWidth(fLineWidth);
   }
 }
+
 FX_BOOL CFDE_TextOut::RetrieveLineWidth(uint32_t dwBreakStatus,
                                         FX_FLOAT& fStartPos,
                                         FX_FLOAT& fWidth,
@@ -330,6 +344,7 @@
   m_iTotalLines++;
   return TRUE;
 }
+
 void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
                             int32_t iLength,
                             int32_t x,
@@ -339,6 +354,7 @@
              m_fFontSize * 1000.0f);
   DrawText(pwsStr, iLength, rtText);
 }
+
 void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
                             int32_t iLength,
                             FX_FLOAT x,
@@ -347,6 +363,7 @@
   rtText.Set(x, y, m_fFontSize * 1000.0f, m_fFontSize * 1000.0f);
   DrawText(pwsStr, iLength, rtText);
 }
+
 void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
                             int32_t iLength,
                             const CFX_Rect& rect) {
@@ -355,6 +372,7 @@
              (FX_FLOAT)rect.height);
   DrawText(pwsStr, iLength, rtText);
 }
+
 void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
                             int32_t iLength,
                             const CFX_RectF& rect) {
@@ -365,6 +383,7 @@
   rm.TransformRect(rtText);
   DrawText(pwsStr, iLength, rtText, m_rtClip);
 }
+
 void CFDE_TextOut::DrawLogicText(const FX_WCHAR* pwsStr,
                                  int32_t iLength,
                                  FX_FLOAT x,
@@ -373,6 +392,7 @@
   rtText.Set(x, y, m_fFontSize * 1000.0f, m_fFontSize * 1000.0f);
   DrawLogicText(pwsStr, iLength, rtText);
 }
+
 void CFDE_TextOut::DrawLogicText(const FX_WCHAR* pwsStr,
                                  int32_t iLength,
                                  const CFX_RectF& rect) {
@@ -382,6 +402,7 @@
   m_Matrix.TransformRect(rtClip);
   DrawText(pwsStr, iLength, rect, rtClip);
 }
+
 void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
                             int32_t iLength,
                             const CFX_RectF& rect,
@@ -408,39 +429,26 @@
   DoAlignment(rect);
   OnDraw(rtClip);
 }
+
 void CFDE_TextOut::ExpandBuffer(int32_t iSize, int32_t iType) {
+  ASSERT(iSize >= 0);
+  size_t size = iSize;
   switch (iType) {
     case 0:
-      if (!m_pCharWidths) {
-        m_pCharWidths = FX_Alloc(int32_t, iSize);
-        m_iChars = iSize;
-      } else if (m_iChars < iSize) {
-        m_pCharWidths = FX_Realloc(int32_t, m_pCharWidths, iSize);
-        m_iChars = iSize;
-      }
-      FXSYS_memset(m_pCharWidths, 0, iSize * sizeof(int32_t));
+      if (m_CharWidths.size() < size)
+        m_CharWidths.resize(size, 0);
       break;
     case 1:
-      if (!m_pEllCharWidths) {
-        m_pEllCharWidths = FX_Alloc(int32_t, iSize);
-        m_iEllChars = iSize;
-      } else if (m_iEllChars < iSize) {
-        m_pEllCharWidths = FX_Realloc(int32_t, m_pEllCharWidths, iSize);
-        m_iEllChars = iSize;
-      }
-      FXSYS_memset(m_pEllCharWidths, 0, iSize * sizeof(int32_t));
+      if (m_EllCharWidths.size() < size)
+        m_EllCharWidths.resize(size, 0);
       break;
     case 2:
-      if (!m_pCharPos) {
-        m_pCharPos = FX_Alloc(FXTEXT_CHARPOS, iSize);
-        m_iCharPosSize = iSize;
-      } else if (m_iCharPosSize < iSize) {
-        m_pCharPos = FX_Realloc(FXTEXT_CHARPOS, m_pCharPos, iSize);
-        m_iCharPosSize = iSize;
-      }
+      if (m_CharPos.size() < size)
+        m_CharPos.resize(size, FXTEXT_CHARPOS());
       break;
   }
 }
+
 void CFDE_TextOut::LoadEllipsis() {
   if (!m_bElliChanged) {
     return;
@@ -453,41 +461,36 @@
   }
   ExpandBuffer(iLength, 1);
   const FX_WCHAR* pStr = m_wsEllipsis.c_str();
-  int32_t* pCharWidths = m_pEllCharWidths;
   uint32_t dwBreakStatus;
   FX_WCHAR wch;
   while (iLength-- > 0) {
     wch = *pStr++;
     dwBreakStatus = m_pTxtBreak->AppendChar(wch);
-    if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
-      RetrieveEllPieces(pCharWidths);
-    }
+    if (dwBreakStatus > FX_TXTBREAK_PieceBreak)
+      RetrieveEllPieces(&m_EllCharWidths);
   }
   dwBreakStatus = m_pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
-  if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
-    RetrieveEllPieces(pCharWidths);
-  }
+  if (dwBreakStatus > FX_TXTBREAK_PieceBreak)
+    RetrieveEllPieces(&m_EllCharWidths);
   m_pTxtBreak->Reset();
 }
-void CFDE_TextOut::RetrieveEllPieces(int32_t*& pCharWidths) {
+
+void CFDE_TextOut::RetrieveEllPieces(std::vector<int32_t>* pCharWidths) {
   int32_t iCount = m_pTxtBreak->CountBreakPieces();
-  CFX_Char* pTC;
+  int32_t iCharIndex = 0;
   for (int32_t i = 0; i < iCount; i++) {
     const CFX_TxtPiece* pPiece = m_pTxtBreak->GetBreakPiece(i);
     int32_t iPieceChars = pPiece->GetLength();
     for (int32_t j = 0; j < iPieceChars; j++) {
-      pTC = pPiece->GetCharPtr(j);
-      if (pTC->m_iCharWidth <= 0) {
-        *pCharWidths = 0;
-      } else {
-        *pCharWidths = pTC->m_iCharWidth;
-      }
-      m_iEllipsisWidth += *pCharWidths;
-      pCharWidths++;
+      CFX_Char* pTC = pPiece->GetCharPtr(j);
+      (*pCharWidths)[iCharIndex] = std::max(pTC->m_iCharWidth, 0);
+      m_iEllipsisWidth += (*pCharWidths)[iCharIndex];
+      iCharIndex++;
     }
   }
   m_pTxtBreak->ClearBreakPieces();
 }
+
 void CFDE_TextOut::LoadText(const FX_WCHAR* pwsStr,
                             int32_t iLength,
                             const CFX_RectF& rect) {
@@ -551,6 +554,7 @@
   m_pTxtBreak->Reset();
   m_wsText.ReleaseBuffer(iLength);
 }
+
 FX_BOOL CFDE_TextOut::RetriecePieces(uint32_t dwBreakStatus,
                                      int32_t& iStartChar,
                                      int32_t& iPieceWidths,
@@ -585,7 +589,7 @@
         }
       }
       iWidth += iCurCharWidth;
-      m_pCharWidths[iChar++] = iCurCharWidth;
+      m_CharWidths[iChar++] = iCurCharWidth;
     }
     if (j == 0 && !bReload) {
       CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(m_iCurLine);
@@ -621,6 +625,7 @@
                  dwBreakStatus == FX_TXTBREAK_ParagraphBreak;
   return bRet;
 }
+
 void CFDE_TextOut::AppendPiece(const FDE_TTOPIECE& ttoPiece,
                                FX_BOOL bNeedReload,
                                FX_BOOL bEnd) {
@@ -644,6 +649,7 @@
     m_iCurPiece = 0;
   }
 }
+
 void CFDE_TextOut::ReplaceWidthEllipsis() {
   LoadEllipsis();
   int32_t iLength = m_wsEllipsis.GetLength();
@@ -670,14 +676,14 @@
           break;
         }
         int32_t index = pPiece->iStartChar + j;
-        iCharWidth += m_pCharWidths[index];
+        iCharWidth += m_CharWidths[index];
         iCharCount++;
         if (iCharCount <= iLength) {
           m_wsText.SetAt(index, m_wsEllipsis.GetAt(iEllipsisCharIndex));
-          m_pCharWidths[index] = m_pEllCharWidths[iEllipsisCharIndex];
+          m_CharWidths[index] = m_EllCharWidths[iEllipsisCharIndex];
         } else if (iCharWidth <= m_iEllipsisWidth) {
           m_wsText.SetAt(index, 0);
-          m_pCharWidths[index] = 0;
+          m_CharWidths[index] = 0;
         }
         iEllipsisCharIndex--;
       }
@@ -687,6 +693,7 @@
     }
   }
 }
+
 void CFDE_TextOut::Reload(const CFX_RectF& rect) {
   int32_t iCount = m_ttoLines.GetSize();
   for (int32_t i = 0; i < iCount; i++) {
@@ -699,6 +706,7 @@
     ReloadLinePiece(pLine, rect);
   }
 }
+
 void CFDE_TextOut::ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect) {
   const FX_WCHAR* pwsStr = m_wsText.c_str();
   FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout);
@@ -730,6 +738,7 @@
   }
   m_pTxtBreak->Reset();
 }
+
 void CFDE_TextOut::DoAlignment(const CFX_RectF& rect) {
   FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout);
   FX_FLOAT fLineStopS = bVertical ? rect.right() : rect.bottom();
@@ -763,6 +772,7 @@
     }
   }
 }
+
 void CFDE_TextOut::OnDraw(const CFX_RectF& rtClip) {
   if (!m_pRenderDevice)
     return;
@@ -788,7 +798,7 @@
 
       int32_t iCount = GetDisplayPos(pPiece);
       if (iCount > 0) {
-        m_pRenderDevice->DrawString(pBrush, m_pFont, m_pCharPos, iCount,
+        m_pRenderDevice->DrawString(pBrush, m_pFont, m_CharPos.data(), iCount,
                                     m_fFontSize, &m_Matrix);
       }
       DrawLine(pPiece, pPen);
@@ -802,7 +812,7 @@
 int32_t CFDE_TextOut::GetDisplayPos(FDE_TTOPIECE* pPiece) {
   FX_TXTRUN tr = ToTextRun(pPiece);
   ExpandBuffer(tr.iLength, 2);
-  return m_pTxtBreak->GetDisplayPos(&tr, m_pCharPos);
+  return m_pTxtBreak->GetDisplayPos(&tr, m_CharPos.data());
 }
 
 int32_t CFDE_TextOut::GetCharRects(const FDE_TTOPIECE* pPiece) {
@@ -814,7 +824,7 @@
 FX_TXTRUN CFDE_TextOut::ToTextRun(const FDE_TTOPIECE* pPiece) {
   FX_TXTRUN tr;
   tr.wsStr = m_wsText + pPiece->iStartChar;
-  tr.pWidths = m_pCharWidths + pPiece->iStartChar;
+  tr.pWidths = &m_CharWidths[pPiece->iStartChar];
   tr.iLength = pPiece->iChars;
   tr.pFont = m_pFont;
   tr.fFontSize = m_fFontSize;
@@ -922,18 +932,22 @@
   }
   return index;
 }
+
 int32_t CFDE_TTOLine::GetSize() const {
   return m_iPieceCount;
 }
+
 FDE_TTOPIECE* CFDE_TTOLine::GetPtrAt(int32_t index) {
   if (index >= m_iPieceCount) {
     return nullptr;
   }
   return m_pieces.GetPtrAt(index);
 }
+
 void CFDE_TTOLine::RemoveLast(int32_t iCount) {
   m_pieces.RemoveLast(iCount);
 }
+
 void CFDE_TTOLine::RemoveAll(FX_BOOL bLeaveMemory) {
   m_pieces.RemoveAll(bLeaveMemory);
 }
diff --git a/xfa/fde/tto/fde_textout.h b/xfa/fde/tto/fde_textout.h
index 14ca5e1..8d2c0fe 100644
--- a/xfa/fde/tto/fde_textout.h
+++ b/xfa/fde/tto/fde_textout.h
@@ -8,6 +8,7 @@
 #define XFA_FDE_TTO_FDE_TEXTOUT_H_
 
 #include <memory>
+#include <vector>
 
 #include "core/fxge/include/fx_dib.h"
 #include "core/fxge/include/fx_ge.h"
@@ -131,7 +132,7 @@
   void LoadText(const FX_WCHAR* pwsStr, int32_t iLength, const CFX_RectF& rect);
   void LoadEllipsis();
   void ExpandBuffer(int32_t iSize, int32_t iType);
-  void RetrieveEllPieces(int32_t*& pCharWidths);
+  void RetrieveEllPieces(std::vector<int32_t>* pCharWidths);
 
   void Reload(const CFX_RectF& rect);
   void ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect);
@@ -152,18 +153,16 @@
   FX_TXTRUN ToTextRun(const FDE_TTOPIECE* pPiece);
   void DrawLine(const FDE_TTOPIECE* pPiece, CFDE_Pen*& pPen);
 
-  CFX_TxtBreak* m_pTxtBreak;
-  CFGAS_GEFont* m_pFont;
+  std::unique_ptr<CFX_TxtBreak> m_pTxtBreak;
+  CFGAS_GEFont* m_pFont;  // not owned.
   FX_FLOAT m_fFontSize;
   FX_FLOAT m_fLineSpace;
   FX_FLOAT m_fLinePos;
   FX_FLOAT m_fTolerance;
   int32_t m_iAlignment;
   int32_t m_iTxtBkAlignment;
-  int32_t* m_pCharWidths;
-  int32_t m_iChars;
-  int32_t* m_pEllCharWidths;
-  int32_t m_iEllChars;
+  std::vector<int32_t> m_CharWidths;
+  std::vector<int32_t> m_EllCharWidths;
   FX_WCHAR m_wParagraphBkChar;
   FX_ARGB m_TxtColor;
   uint32_t m_dwStyles;
@@ -179,8 +178,7 @@
   int32_t m_iCurLine;
   int32_t m_iCurPiece;
   int32_t m_iTotalLines;
-  FXTEXT_CHARPOS* m_pCharPos;
-  int32_t m_iCharPosSize;
+  std::vector<FXTEXT_CHARPOS> m_CharPos;
   std::unique_ptr<CFDE_RenderDevice> m_pRenderDevice;
   CFX_Int32Array m_hotKeys;
   CFX_RectFArray m_rectArray;
diff --git a/xfa/fgas/crt/fgas_memory.cpp b/xfa/fgas/crt/fgas_memory.cpp
index d218f42..e587f5a 100644
--- a/xfa/fgas/crt/fgas_memory.cpp
+++ b/xfa/fgas/crt/fgas_memory.cpp
@@ -27,10 +27,11 @@
 
 }  // namespace
 
-IFX_MemoryAllocator* IFX_MemoryAllocator::Create(FX_ALLOCTYPE eType,
-                                                 size_t chunkSize,
-                                                 size_t blockSize) {
-  return new CFX_DefStore();
+std::unique_ptr<IFX_MemoryAllocator> IFX_MemoryAllocator::Create(
+    FX_ALLOCTYPE eType,
+    size_t chunkSize,
+    size_t blockSize) {
+  return std::unique_ptr<IFX_MemoryAllocator>(new CFX_DefStore());
 }
 
 #else  // MEMORY_TOOL_REPLACES_ALLOCATOR
@@ -88,17 +89,19 @@
 
 #define FX_4BYTEALIGN(size) (((size) + 3) & ~3)
 
-IFX_MemoryAllocator* IFX_MemoryAllocator::Create(FX_ALLOCTYPE eType,
-                                                 size_t chunkSize,
-                                                 size_t blockSize) {
+std::unique_ptr<IFX_MemoryAllocator> IFX_MemoryAllocator::Create(
+    FX_ALLOCTYPE eType,
+    size_t chunkSize,
+    size_t blockSize) {
   switch (eType) {
     case FX_ALLOCTYPE_Static:
-      return new CFX_StaticStore(chunkSize);
+      return std::unique_ptr<IFX_MemoryAllocator>(
+          new CFX_StaticStore(chunkSize));
     case FX_ALLOCTYPE_Fixed:
-      return new CFX_FixedStore(blockSize, chunkSize);
+      return std::unique_ptr<IFX_MemoryAllocator>(new CFX_FixedStore(blockSize, chunkSize);
     default:
       ASSERT(0);
-      return nullptr;
+      return std::unique_ptr<IFX_MemoryAllocator>();
   }
 }
 
diff --git a/xfa/fgas/crt/fgas_memory.h b/xfa/fgas/crt/fgas_memory.h
index a83933c..1034c41 100644
--- a/xfa/fgas/crt/fgas_memory.h
+++ b/xfa/fgas/crt/fgas_memory.h
@@ -7,6 +7,8 @@
 #ifndef XFA_FGAS_CRT_FGAS_MEMORY_H_
 #define XFA_FGAS_CRT_FGAS_MEMORY_H_
 
+#include <memory>
+
 #include "core/fxcrt/include/fx_memory.h"
 #include "core/fxcrt/include/fx_system.h"
 
@@ -21,9 +23,9 @@
   virtual void* Alloc(size_t size) = 0;
   virtual void Free(void* pBlock) = 0;
 
-  static IFX_MemoryAllocator* Create(FX_ALLOCTYPE eType,
-                                     size_t chunkSize,
-                                     size_t blockSize);
+  static std::unique_ptr<IFX_MemoryAllocator> Create(FX_ALLOCTYPE eType,
+                                                     size_t chunkSize,
+                                                     size_t blockSize);
 };
 
 class CFX_Target {
diff --git a/xfa/fxfa/app/xfa_textlayout.cpp b/xfa/fxfa/app/xfa_textlayout.cpp
index 88645b7..6ac5c05 100644
--- a/xfa/fxfa/app/xfa_textlayout.cpp
+++ b/xfa/fxfa/app/xfa_textlayout.cpp
@@ -96,8 +96,7 @@
     CXFA_FFDoc* pDoc = pTextProvider->GetDocNode();
     IFGAS_FontMgr* pFontMgr = pDoc->GetApp()->GetFDEFontMgr();
     ASSERT(pFontMgr);
-    m_pSelector.reset(new CFDE_CSSStyleSelector);
-    m_pSelector->SetFontMgr(pFontMgr);
+    m_pSelector.reset(new CFDE_CSSStyleSelector(pFontMgr));
     FX_FLOAT fFontSize = 10;
     CXFA_Font font = pTextProvider->GetFontNode();
     if (font) {
@@ -252,8 +251,8 @@
   if (!pXMLContainer || !pTextProvider || m_pAllocator) {
     return;
   }
-  m_pAllocator.reset(IFX_MemoryAllocator::Create(FX_ALLOCTYPE_Fixed, 32,
-                                                 sizeof(CXFA_CSSTagProvider)));
+  m_pAllocator = IFX_MemoryAllocator::Create(FX_ALLOCTYPE_Fixed, 32,
+                                             sizeof(CXFA_CSSTagProvider));
   InitCSSData(pTextProvider);
   IFDE_CSSComputedStyle* pRootStyle = CreateRootStyle(pTextProvider);
   ParseRichText(pXMLContainer, pRootStyle);
@@ -1294,8 +1293,7 @@
                                 FX_FLOAT& fLinePos,
                                 FX_BOOL bSavePieces) {
   if (!m_pAllocator) {
-    m_pAllocator.reset(
-        IFX_MemoryAllocator::Create(FX_ALLOCTYPE_Static, 256, 0));
+    m_pAllocator = IFX_MemoryAllocator::Create(FX_ALLOCTYPE_Static, 256, 0);
   }
   GetTextDataNode();
   if (!m_pTextDataNode)
