mirror of
https://github.com/fanlumaster/googlepinyinime-rev.git
synced 2026-10-10 04:53:13 +08:00
fix(decoder): 修复模型重载的内存释放与树节点泄漏
This commit is contained in:
@@ -84,11 +84,11 @@ SpellingTrie::~SpellingTrie() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (NULL != dumb_node_) {
|
if (NULL != dumb_node_) {
|
||||||
delete[] dumb_node_;
|
delete dumb_node_;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NULL != splitter_node_) {
|
if (NULL != splitter_node_) {
|
||||||
delete[] splitter_node_;
|
delete splitter_node_;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NULL != instance_) {
|
if (NULL != instance_) {
|
||||||
@@ -266,6 +266,14 @@ bool SpellingTrie::construct(const char* spelling_arr, size_t item_size, size_t
|
|||||||
node_num_ = 1;
|
node_num_ = 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Model reloads reuse this singleton; release the previous tree first.
|
||||||
|
if (root_) {
|
||||||
|
free_son_trie(root_);
|
||||||
|
delete root_;
|
||||||
|
}
|
||||||
|
delete dumb_node_;
|
||||||
|
delete splitter_node_;
|
||||||
|
|
||||||
root_ = new SpellingNode();
|
root_ = new SpellingNode();
|
||||||
memset(root_, 0, sizeof(SpellingNode));
|
memset(root_, 0, sizeof(SpellingNode));
|
||||||
|
|
||||||
@@ -346,7 +354,7 @@ bool SpellingTrie::build_ym_info() {
|
|||||||
delete spl_table;
|
delete spl_table;
|
||||||
|
|
||||||
// Generate the maping from the spelling ids to the Yunmu ids.
|
// Generate the maping from the spelling ids to the Yunmu ids.
|
||||||
if (spl_ym_ids_) delete spl_ym_ids_;
|
if (spl_ym_ids_) delete[] spl_ym_ids_;
|
||||||
spl_ym_ids_ = new uint8[spelling_num_ + kFullSplIdStart];
|
spl_ym_ids_ = new uint8[spelling_num_ + kFullSplIdStart];
|
||||||
if (NULL == spl_ym_ids_) return false;
|
if (NULL == spl_ym_ids_) return false;
|
||||||
|
|
||||||
|
|||||||
+14
-12
@@ -6,21 +6,23 @@
|
|||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
if (argc != 3) return 2;
|
if (argc != 3) return 2;
|
||||||
std::remove(argv[2]);
|
std::remove(argv[2]);
|
||||||
if (!ime_pinyin::im_open_decoder(argv[1], argv[2])) {
|
|
||||||
std::cerr << "Cannot open decoder dictionary\n";
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
int status = 0;
|
int status = 0;
|
||||||
for (const char* input : {"nihao", "zhongguo", "shurufa"}) {
|
for (int reload = 0; reload < 3; ++reload) {
|
||||||
ime_pinyin::im_reset_search();
|
if (!ime_pinyin::im_open_decoder(argv[1], argv[2])) {
|
||||||
const auto count = ime_pinyin::im_search(input, std::strlen(input));
|
std::cerr << "Cannot open decoder dictionary\n";
|
||||||
ime_pinyin::char16 candidate[256] = {};
|
return 1;
|
||||||
if (!count || !ime_pinyin::im_get_candidate(0, candidate, 256) || !candidate[0]) {
|
|
||||||
std::cerr << "No candidate for " << input << '\n';
|
|
||||||
status = 1;
|
|
||||||
}
|
}
|
||||||
|
for (const char* input : {"nihao", "zhongguo", "shurufa"}) {
|
||||||
|
ime_pinyin::im_reset_search();
|
||||||
|
const auto count = ime_pinyin::im_search(input, std::strlen(input));
|
||||||
|
ime_pinyin::char16 candidate[256] = {};
|
||||||
|
if (!count || !ime_pinyin::im_get_candidate(0, candidate, 256) || !candidate[0]) {
|
||||||
|
std::cerr << "No candidate for " << input << '\n';
|
||||||
|
status = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ime_pinyin::im_close_decoder();
|
||||||
}
|
}
|
||||||
ime_pinyin::im_close_decoder();
|
|
||||||
std::remove(argv[2]);
|
std::remove(argv[2]);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user