diff --git a/native_client/ctcdecode/ctc_beam_search_decoder.cpp b/native_client/ctcdecode/ctc_beam_search_decoder.cpp
index f6ec3082..64d0e338 100644
--- a/native_client/ctcdecode/ctc_beam_search_decoder.cpp
+++ b/native_client/ctcdecode/ctc_beam_search_decoder.cpp
@@ -37,7 +37,8 @@ DecoderState::init(const Alphabet& alphabet,
   prefixes_.push_back(root);
 
   if (ext_scorer != nullptr && !ext_scorer->is_character_based()) {
-    auto dict_ptr = ext_scorer->dictionary->Copy(true);
+    // no need for std::make_shared<>() since Copy() does 'new' behind the doors
+    auto dict_ptr = std::shared_ptr<PathTrie::FstType>(ext_scorer->dictionary->Copy(true));
     root->set_dictionary(dict_ptr);
     auto matcher = std::make_shared<fst::SortedMatcher<PathTrie::FstType>>(*dict_ptr, fst::MATCH_INPUT);
     root->set_matcher(matcher);
diff --git a/native_client/ctcdecode/path_trie.cpp b/native_client/ctcdecode/path_trie.cpp
index 51f75ff3..c1ad2441 100644
--- a/native_client/ctcdecode/path_trie.cpp
+++ b/native_client/ctcdecode/path_trie.cpp
@@ -165,9 +165,9 @@ void PathTrie::remove() {
   }
 }
 
-void PathTrie::set_dictionary(PathTrie::FstType* dictionary) {
+void PathTrie::set_dictionary(std::shared_ptr<PathTrie::FstType> dictionary) {
   dictionary_ = dictionary;
-  dictionary_state_ = dictionary->Start();
+  dictionary_state_ = dictionary_->Start();
   has_dictionary_ = true;
 }
 
@@ -201,4 +201,4 @@ void PathTrie::print(const Alphabet& a) {
   printf("\n");
   printf("transcript:\t %s\n", tr.c_str());
 }
-#endif // DEBUG
\ No newline at end of file
+#endif // DEBUG
diff --git a/native_client/ctcdecode/path_trie.h b/native_client/ctcdecode/path_trie.h
index 9b71f35b..04cbfdd5 100644
--- a/native_client/ctcdecode/path_trie.h
+++ b/native_client/ctcdecode/path_trie.h
@@ -39,7 +39,7 @@ public:
   void iterate_to_vec(std::vector<PathTrie*>& output);
 
   // set dictionary for FST
-  void set_dictionary(FstType* dictionary);
+  void set_dictionary(std::shared_ptr<FstType> dictionary);
 
   void set_matcher(std::shared_ptr<fst::SortedMatcher<FstType>>);
 
@@ -72,7 +72,7 @@ private:
   std::vector<std::pair<int, PathTrie*>> children_;
 
   // pointer to dictionary of FST
-  FstType* dictionary_;
+  std::shared_ptr<FstType> dictionary_;
   FstType::StateId dictionary_state_;
   // true if finding ars in FST
   std::shared_ptr<fst::SortedMatcher<FstType>> matcher_;