Мой код использует распределитель памяти кучи.Объект leafNode, на который ссылается приведенный ниже код, является результатом приведения кучи ptr, полученного из распределителя, в struct: leafNode.структура leafNode содержит массив std :: string и другой массив объектов RID, никаких других полей.Поскольку я манипулирую этими строками (в keyArray) в куче, я думаю, что они не очищаются должным образом при назначении.Запустив valgrind, я вижу вывод, подобный следующему.Как мне избежать этих утечек памяти?
11 bytes in 1 blocks are definitely lost in loss record 1 of 20
==5952== at 0x4837DEF: operator new(unsigned long) (vg_replace_malloc.c:334)
==5952== by 0x49D1A1F: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (basic_string.tcc:265)
==5952== by 0x49D1D9D: assign (basic_string.h:1366)
==5952== by 0x49D1D9D: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (basic_string.h:695)
==5952== by 0x11DC11: void db::Index::insertIntoLeaf<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, db::LeafNodeString, db::NonLeafNodeString>(db::RIDKeyPair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, db::LeafNodeString*)
leafNode struct:
struct LeafNode {
std::string keyArray[STRINGARRAYLEAFSIZE2];
RecordId ridArray[STRINGARRAYLEAFSIZE2];
};
Вот код для функции insertIntoLeaf:
int index = 0;
for (int i = 0; i < leafOccupancy; i++) {
if (leafNode->ridArray[i].page_number == 0 ||
entry.key <
/*=*/leafNode->keyArray[i]) { // no duplicates so no need for <=
index = i;
if (leafNode->ridArray[index].page_number != 0 &&
index < leafOccupancy - 1) {
std::rotate(&(leafNode->keyArray[index]),
&(leafNode->keyArray[leafOccupancy - 1]),
&(leafNode->keyArray[leafOccupancy]));
std::rotate(&(leafNode->ridArray[index]),
&(leafNode->ridArray[leafOccupancy - 1]),
&(leafNode->ridArray[leafOccupancy]));
}
leafNode->keyArray[index] = entry.key;
leafNode->ridArray[index] = entry.rid;
return;
}