0
source에서 streed2006.cpp 라이브러리를 사용했습니다. 코드가 가장자리를 삭제할 때 메모리 누수가 있습니다.접미사 트리에서의 메모리 누수 C++
//throwing away the edges from hashtable
for(int t=0;t<HASH_TABLE_SIZE;t++)
{
Edges[t].Remove();
Edges[t].start_node == -1
}
Valgrind의 출력 :
3,920 bytes in 245 blocks are definitely lost in loss record 9 of 12
==6301== at 0x4029F34: operator new(unsigned int) (in /usr/lib/valgrind /vgpreload_memcheck-x86-linux.so)
==6301== by 0x804A683: Edge::SplitEdge(Suffix&) (suffix_tree.cpp:555)
==6301== by 0x804B02F: AddPrefix(Suffix&, int) (suffix_tree.cpp:753)
방법 가장자리를 삭제하는 나를 인도 해주십시오 나는 다음과 같은 코드를 사용하여 해시 테이블에서 에지 개수를 클리어.
은 메모리 누수를 제거 할 수있었습니다.
void AddPrefix(Suffix &active, int last_char_index)
{
int parent_node;
int last_parent_node = -1;
for (; ;) {
Edge edge;
parent_node = active.origin_node;
if (active.Explicit()) {
edge = Edge::Find(active.origin_node, T[ last_char_index ]);
if (edge.start_node != -1)
break;
} else { //implicit node, a little more complicated
edge = Edge::Find(active.origin_node, T[ active.first_char_index ]);
int span = active.last_char_index - active.first_char_index;
if (T[ edge.first_char_index + span + 1 ] == T[ last_char_index ])
break;
parent_node = edge.SplitEdge(active);
}
Edge *new_edge = new Edge(last_char_index, T.N, parent_node);
new_edge->Insert();
//cout << "Created edge to new leaf: " << *new_edge << "\n";
AddSuffixLink(last_parent_node, parent_node);
if (active.origin_node == 0) {
//cout << "Can't follow suffix link, I'm at the root\n";
active.first_char_index++;
} else {
/*
cout << "Following suffix link from node "
<< active.origin_node
<< " to node "
<< Suffix_Nodes[ active.origin_node ].suffix_node
<< ".\n";
*/
active.origin_node = Suffix_Nodes[ active.origin_node ].suffix_node;
//cout << "New prefix : " << active << "\n";
}
active.Canonize();
delete(new_edge);
new_edge = NULL;
}
AddSuffixLink(last_parent_node, parent_node);
active.last_char_index++; //Now the endpoint is the next active point
active.Canonize();
};
및
int Edge::SplitEdge(Suffix &s)
{
//cout << "Splitting edge: " << *this << "\n";
Remove();
Edge *new_edge =
new Edge(first_char_index,
first_char_index + s.last_char_index - s.first_char_index,
s.origin_node);
new_edge->Insert();
Suffix_Nodes[ new_edge->end_node ].suffix_node = s.origin_node;
first_char_index += s.last_char_index - s.first_char_index + 1;
start_node = new_edge->end_node;
Insert();
//cout << "New edge: " << *new_edge << "\n";
//cout << "Old edge: " << *this << "\n";
delete(new_edge);
//return new_edge->end_node;
return(start_node);
}
구체적인 질문은 다음과 같습니다 솔루션입니다 다음은? – Leonardo
@ leonardo 프로그램에서 메모리 누수가 있습니다. 분석 결과 가장자리가 삭제되지 않기 때문입니다. 그래서 더 이상 필요하지 않으면 가장자리를 지우는 방법을 알려주는 것이 필요합니다. – priyanka
'Edges :: Remove()'함수의 주석 블록을 읽었습니까? – Leonardo