diff --git a/native/jni/src/suggest/core/dictionary/unigram_property.cpp b/native/jni/src/suggest/core/dictionary/unigram_property.cpp
index 16bbb69d8963570ea87f9652370bddef21cd4645..be8a22a53c43e07587b2db9f118ff3508cfff7b2 100644
--- a/native/jni/src/suggest/core/dictionary/unigram_property.cpp
+++ b/native/jni/src/suggest/core/dictionary/unigram_property.cpp
@@ -21,7 +21,7 @@ namespace latinime {
 void UnigramProperty::outputProperties(JNIEnv *const env, jintArray outCodePoints,
         jbooleanArray outFlags, jintArray outProbability, jintArray outHistoricalInfo,
         jobject outShortcutTargets, jobject outShortcutProbabilities) const {
-    env->SetIntArrayRegion(outCodePoints, 0 /* start */, mCodePointCount, mCodePoints);
+    env->SetIntArrayRegion(outCodePoints, 0 /* start */, mCodePoints.size(), &mCodePoints[0]);
     jboolean flags[] = {mIsNotAWord, mIsBlacklisted, mHasBigrams, mHasShortcuts};
     env->SetBooleanArrayRegion(outFlags, 0 /* start */, NELEMS(flags), flags);
     env->SetIntArrayRegion(outProbability, 0 /* start */, 1 /* len */, &mProbability);
diff --git a/native/jni/src/suggest/core/dictionary/unigram_property.h b/native/jni/src/suggest/core/dictionary/unigram_property.h
index c4ebb86abcd7a6c2f08d616a2e711437646433bf..4acde937b9d2e5f780079e29c8c0330d8575688a 100644
--- a/native/jni/src/suggest/core/dictionary/unigram_property.h
+++ b/native/jni/src/suggest/core/dictionary/unigram_property.h
@@ -30,36 +30,20 @@ class UnigramProperty {
  public:
     // Invalid unigram.
     UnigramProperty()
-            : mCodePoints(), mCodePointCount(0), mIsNotAWord(false), mIsBlacklisted(false),
+            : mCodePoints(), mIsNotAWord(false), mIsBlacklisted(false),
               mHasBigrams(false), mHasShortcuts(false), mProbability(NOT_A_PROBABILITY),
               mTimestamp(0), mLevel(0), mCount(0), mShortcutTargets(), mShortcutProbabilities() {}
 
-    UnigramProperty(const UnigramProperty &unigramProperty)
-            : mCodePoints(), mCodePointCount(unigramProperty.mCodePointCount),
-              mIsNotAWord(unigramProperty.mIsNotAWord),
-              mIsBlacklisted(unigramProperty.mIsBlacklisted),
-              mHasBigrams(unigramProperty.mHasBigrams),
-              mHasShortcuts(unigramProperty.mHasShortcuts),
-              mProbability(unigramProperty.mProbability),
-              mTimestamp(unigramProperty.mTimestamp), mLevel(unigramProperty.mLevel),
-              mCount(unigramProperty.mCount), mShortcutTargets(unigramProperty.mShortcutTargets),
-              mShortcutProbabilities(unigramProperty.mShortcutProbabilities) {
-        memcpy(mCodePoints, unigramProperty.mCodePoints, sizeof(mCodePoints));
-    }
-
-    UnigramProperty(const int *const codePoints, const int codePointCount,
+    UnigramProperty(const std::vector<int> *const codePoints,
             const bool isNotAWord, const bool isBlacklisted, const bool hasBigrams,
             const bool hasShortcuts, const int probability, const int timestamp,
             const int level, const int count,
             const std::vector<std::vector<int> > *const shortcutTargets,
             const std::vector<int> *const shortcutProbabilities)
-            : mCodePoints(), mCodePointCount(codePointCount),
-              mIsNotAWord(isNotAWord), mIsBlacklisted(isBlacklisted), mHasBigrams(hasBigrams),
-              mHasShortcuts(hasShortcuts), mProbability(probability), mTimestamp(timestamp),
-              mLevel(level), mCount(count), mShortcutTargets(*shortcutTargets),
-              mShortcutProbabilities(*shortcutProbabilities) {
-        memcpy(mCodePoints, codePoints, sizeof(mCodePoints));
-    }
+            : mCodePoints(*codePoints), mIsNotAWord(isNotAWord), mIsBlacklisted(isBlacklisted),
+              mHasBigrams(hasBigrams), mHasShortcuts(hasShortcuts), mProbability(probability),
+              mTimestamp(timestamp), mLevel(level), mCount(count),
+              mShortcutTargets(*shortcutTargets), mShortcutProbabilities(*shortcutProbabilities) {}
 
     void outputProperties(JNIEnv *const env, jintArray outCodePoints, jbooleanArray outFlags,
             jintArray outProbability, jintArray outHistoricalInfo, jobject outShortcutTargets,
@@ -68,8 +52,7 @@ class UnigramProperty {
  private:
     DISALLOW_ASSIGNMENT_OPERATOR(UnigramProperty);
 
-    int mCodePoints[MAX_WORD_LENGTH];
-    int mCodePointCount;
+    std::vector<int> mCodePoints;
     bool mIsNotAWord;
     bool mIsBlacklisted;
     bool mHasBigrams;
diff --git a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp
index b4730fe68c2b2dd80f6bad07b108e4c87beb7a97..dee77c81bdd5c667609ba979c52b6a803e7b1bab 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/structure/v4/ver4_patricia_trie_policy.cpp
@@ -326,6 +326,8 @@ const UnigramProperty Ver4PatriciaTriePolicy::getUnigramProperty(const int *cons
         return UnigramProperty();
     }
     const PtNodeParams ptNodeParams = mNodeReader.fetchNodeInfoInBufferFromPtNodePos(ptNodePos);
+    std::vector<int> codePointVector(ptNodeParams.getCodePoints(),
+            ptNodeParams.getCodePoints() + ptNodeParams.getCodePointCount());
     const ProbabilityEntry probabilityEntry =
             mBuffers.get()->getProbabilityDictContent()->getProbabilityEntry(
                     ptNodeParams.getTerminalId());
@@ -349,8 +351,8 @@ const UnigramProperty Ver4PatriciaTriePolicy::getUnigramProperty(const int *cons
             shortcutProbabilities.push_back(shortcutProbability);
         }
     }
-    return UnigramProperty(ptNodeParams.getCodePoints(), ptNodeParams.getCodePointCount(),
-            ptNodeParams.isNotAWord(), ptNodeParams.isBlacklisted(), ptNodeParams.hasBigrams(),
+    return UnigramProperty(&codePointVector, ptNodeParams.isNotAWord(),
+            ptNodeParams.isBlacklisted(), ptNodeParams.hasBigrams(),
             ptNodeParams.hasShortcutTargets(), ptNodeParams.getProbability(),
             historicalInfo->getTimeStamp(), historicalInfo->getLevel(),
             historicalInfo->getCount(), &shortcutTargets, &shortcutProbabilities);