утечка памяти для назначенных строк в куче? - PullRequest
0 голосов
/ 05 марта 2019

Мой код использует распределитель памяти кучи.Объект 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;
}
...