diff --git a/samples/pdfium_test.cc b/samples/pdfium_test.cc
index ebc7412..b83663d 100644
--- a/samples/pdfium_test.cc
+++ b/samples/pdfium_test.cc
@@ -1567,14 +1567,14 @@
   }
 
 #ifdef PDF_ENABLE_V8
-  std::unique_ptr<v8::Platform> platform;
+  v8::Platform* platform;
 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
   v8::StartupData natives;
   v8::StartupData snapshot;
-  platform = InitializeV8ForPDFiumWithStartupData(
-      options.exe_path, options.bin_directory, &natives, &snapshot);
+  InitializeV8ForPDFium(options.exe_path, options.bin_directory, &natives,
+                        &snapshot, &platform);
 #else   // V8_USE_EXTERNAL_STARTUP_DATA
-  platform = InitializeV8ForPDFium(options.exe_path);
+  InitializeV8ForPDFium(options.exe_path, &platform);
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
 #endif  // PDF_ENABLE_V8
 
@@ -1641,6 +1641,7 @@
   FPDF_DestroyLibrary();
 #ifdef PDF_ENABLE_V8
   v8::V8::ShutdownPlatform();
+  delete platform;
 
 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
   free(const_cast<char*>(natives.data));
diff --git a/testing/embedder_test_main.cpp b/testing/embedder_test_main.cpp
index 0c3ceb6..ade6118 100644
--- a/testing/embedder_test_main.cpp
+++ b/testing/embedder_test_main.cpp
@@ -34,16 +34,16 @@
 #ifdef PDF_ENABLE_V8
 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
     if (g_v8_natives && g_v8_snapshot) {
-      platform_ = InitializeV8ForPDFiumWithStartupData(
-          g_exe_path, std::string(), nullptr, nullptr);
+      InitializeV8ForPDFium(g_exe_path, std::string(), nullptr, nullptr,
+                            &platform_);
     } else {
       g_v8_natives = new v8::StartupData;
       g_v8_snapshot = new v8::StartupData;
-      platform_ = InitializeV8ForPDFiumWithStartupData(
-          g_exe_path, std::string(), g_v8_natives, g_v8_snapshot);
+      InitializeV8ForPDFium(g_exe_path, std::string(), g_v8_natives,
+                            g_v8_snapshot, &platform_);
     }
 #else
-    platform_ = InitializeV8ForPDFium(g_exe_path);
+    InitializeV8ForPDFium(g_exe_path, &platform_);
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
 #endif  // FPDF_ENABLE_V8
   }
@@ -51,12 +51,13 @@
   void TearDown() override {
 #ifdef PDF_ENABLE_V8
     v8::V8::ShutdownPlatform();
+    delete platform_;
 #endif  // PDF_ENABLE_V8
   }
 
  private:
 #ifdef PDF_ENABLE_V8
-  std::unique_ptr<v8::Platform> platform_;
+  v8::Platform* platform_;
 #endif  // PDF_ENABLE_V8
 };
 
diff --git a/testing/test_support.cpp b/testing/test_support.cpp
index 2b6f436..b32ec7d 100644
--- a/testing/test_support.cpp
+++ b/testing/test_support.cpp
@@ -60,18 +60,17 @@
 }
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
 
-std::unique_ptr<v8::Platform> InitializeV8Common(const std::string& exe_path) {
-  v8::V8::InitializeICUDefaultLocation(exe_path.c_str());
+void InitializeV8Common(const char* exe_path, v8::Platform** platform) {
+  v8::V8::InitializeICUDefaultLocation(exe_path);
 
-  std::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform();
-  v8::V8::InitializePlatform(platform.get());
+  *platform = v8::platform::CreateDefaultPlatform();
+  v8::V8::InitializePlatform(*platform);
 
   // By enabling predictable mode, V8 won't post any background tasks.
   // By enabling GC, it makes it easier to chase use-after-free.
   const char v8_flags[] = "--predictable --expose-gc";
   v8::V8::SetFlagsFromString(v8_flags, static_cast<int>(strlen(v8_flags)));
   v8::V8::Initialize();
-  return platform;
 }
 #endif  // PDF_ENABLE_V8
 
@@ -178,26 +177,27 @@
 
 #ifdef PDF_ENABLE_V8
 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
-std::unique_ptr<v8::Platform> InitializeV8ForPDFiumWithStartupData(
-    const std::string& exe_path,
-    const std::string& bin_dir,
-    v8::StartupData* natives_blob,
-    v8::StartupData* snapshot_blob) {
-  std::unique_ptr<v8::Platform> platform = InitializeV8Common(exe_path);
+bool InitializeV8ForPDFium(const std::string& exe_path,
+                           const std::string& bin_dir,
+                           v8::StartupData* natives_blob,
+                           v8::StartupData* snapshot_blob,
+                           v8::Platform** platform) {
+  InitializeV8Common(exe_path.c_str(), platform);
   if (natives_blob && snapshot_blob) {
     if (!GetExternalData(exe_path, bin_dir, "natives_blob.bin", natives_blob))
-      return nullptr;
+      return false;
     if (!GetExternalData(exe_path, bin_dir, "snapshot_blob.bin", snapshot_blob))
-      return nullptr;
+      return false;
     v8::V8::SetNativesDataBlob(natives_blob);
     v8::V8::SetSnapshotDataBlob(snapshot_blob);
   }
-  return platform;
+  return true;
 }
 #else   // V8_USE_EXTERNAL_STARTUP_DATA
-std::unique_ptr<v8::Platform> InitializeV8ForPDFium(
-    const std::string& exe_path) {
-  return InitializeV8Common(exe_path);
+bool InitializeV8ForPDFium(const std::string& exe_path,
+                           v8::Platform** platform) {
+  InitializeV8Common(exe_path.c_str(), platform);
+  return true;
 }
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
 #endif  // PDF_ENABLE_V8
diff --git a/testing/test_support.h b/testing/test_support.h
index f26e161..ec4b4ae 100644
--- a/testing/test_support.h
+++ b/testing/test_support.h
@@ -91,17 +91,14 @@
 namespace v8 {
 class StartupData;
 }
-
-// |natives_blob| and |snapshot_blob| are optional out parameters. They should
-// either both be valid or both be nullptrs.
-std::unique_ptr<v8::Platform> InitializeV8ForPDFiumWithStartupData(
-    const std::string& exe_path,
-    const std::string& bin_dir,
-    v8::StartupData* natives_blob,
-    v8::StartupData* snapshot_blob);
+bool InitializeV8ForPDFium(const std::string& exe_path,
+                           const std::string& bin_dir,
+                           v8::StartupData* natives_blob,
+                           v8::StartupData* snapshot_blob,
+                           v8::Platform** platform);
 #else   // V8_USE_EXTERNAL_STARTUP_DATA
-std::unique_ptr<v8::Platform> InitializeV8ForPDFium(
-    const std::string& exe_path);
+bool InitializeV8ForPDFium(const std::string& exe_path,
+                           v8::Platform** platform);
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
 #endif  // PDF_ENABLE_V8
 
