首页 > 解决方案 > BST 读取大小无效

问题描述

我正在为类分配制作 BST,其中给出了 Insert 函数和 NodeData 类。无论如何,当使用 Valgrind 运行时,我的 DestructorHelper 和大部分时间我的 Insert 都会经常遇到内存泄漏错误。

插入 - 将节点插入树中

bool BinTree::insert(NodeData* dataptr) {
   Node* ptr = new Node;     // exception is thrown if memory is not allocated
   ptr->data = dataptr;
   ptr->left = ptr->right = nullptr;
   if (isEmpty()) {
      root = ptr;
   } else {
      Node* current = root;
      bool inserted = false;

      // if item is less than current item, insert in left subtree,
      // otherwise insert in right subtree
      while (!inserted) {
         if(*ptr->data == *current->data) {
             delete ptr;
             return false;
         }
         if (*ptr->data < *current->data) {
            if (current->left == nullptr) {           // at leaf, insert left
               current->left = ptr;
               inserted = true;
            }
            else
               current = current->left;               // one step left
         }
         else {
            if (current->right == nullptr) {          // at leaf, insert right
               current->right = ptr;
               inserted = true;
            }
            else
               current = current->right;              // one step right
         }
      }
   }
   return true;
}

DestructorHelper - 调用递归删除树

void BinTree::DestructorHelper(Node*& n) {
    if(n) {
    DestructorHelper(n->left);
    DestructorHelper(n->right);
    if(n->data) {
        delete n->data;
    }
    delete n;
}

}

Valgrind 错误

==20913== Invalid read of size 8
==20913==    at 0x10AA4E: BinTree::insert(NodeData*) (in /home/UDRIVE/user/prog/a.out)
==20913==    by 0x10A972: BinTree::TreeHelper(NodeData**, int, int) (in /home/UDRIVE/user/prog/a.out)
==20913==    by 0x10A4CB: BinTree::arrayToBSTree(NodeData**) (in /home/UDRIVE/user/prog/a.out)
==20913==    by 0x109C8A: main (in /home/UDRIVE/user/prog/a.out)
==20913==  Address 0x5a883d0 is 0 bytes inside a block of size 24 free'd
==20913==    at 0x4C2D2DB: operator delete(void*) (vg_replace_malloc.c:576)
==20913==    by 0x10A70B: BinTree::DestructorHelper(BinTree::Node*&) (in /home/UDRIVE/user/prog/a.out)
==20913==    by 0x10A268: BinTree::makeEmpty() (in /home/UDRIVE/user/prog/a.out)
==20913==    by 0x10A45F: BinTree::bstreeToArray(NodeData**) (in /home/UDRIVE/user/prog/a.out)
==20913==    by 0x109C71: main (in /home/UDRIVE/user/prog/a.out)
==20913==  Block was alloc'd at
==20913==    at 0x4C2C21F: operator new(unsigned long) (vg_replace_malloc.c:334)
==20913==    by 0x10A9E5: BinTree::insert(NodeData*) (in /home/UDRIVE/user/prog/a.out)
==20913==    by 0x10A085: buildTree(BinTree&, std::basic_ifstream<char, std::char_traits<char> >&) (in /home/UDRIVE/user/prog/a.out)
==20913==    by 0x109812: main (in /home/UDRIVE/user/prog/a.out)
==20913==
==20913== Invalid read of size 8
==20913==    at 0x4F55F00: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22)
==20913==    by 0x10AF99: __gnu_cxx::__enable_if<std::__is_char<char>::__value, bool>::__type std::operator==<char>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (in /home/UDRIVE/user/prog/a.out)
==20913==    by 0x10ADA0: NodeData::operator==(NodeData const&) const (in /home/UDRIVE/user/prog/a.out)
==20913==    by 0x10AA62: BinTree::insert(NodeData*) (in /home/UDRIVE/user/prog/a.out)
==20913==    by 0x10A972: BinTree::TreeHelper(NodeData**, int, int) (in /home/UDRIVE/user/prog/a.out)
==20913==    by 0x10A4CB: BinTree::arrayToBSTree(NodeData**) (in /home/UDRIVE/user/prog/a.out)
==20913==    by 0x109C8A: main (in /home/UDRIVE/user/prog/a.out)
==20913==  Address 0x8 is not stack'd, malloc'd or (recently) free'd
==20913==
==20913==
==20913== Process terminating with default action of signal 11 (SIGSEGV)
==20913==  Access not within mapped region at address 0x8
==20913==    at 0x4F55F00: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22)
==20913==    by 0x10AF99: __gnu_cxx::__enable_if<std::__is_char<char>::__value, bool>::__type std::operator==<char>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (in /home/UDRIVE/user/prog/a.out)
==20913==    by 0x10ADA0: NodeData::operator==(NodeData const&) const (in /home/UDRIVE/user/prog/a.out)
==20913==    by 0x10AA62: BinTree::insert(NodeData*) (in /home/UDRIVE/user/prog/a.out)
==20913==    by 0x10A972: BinTree::TreeHelper(NodeData**, int, int) (in /home/UDRIVE/user/prog/a.out)
==20913==    by 0x10A4CB: BinTree::arrayToBSTree(NodeData**) (in /home/UDRIVE/user/prog/a.out)
==20913==    by 0x109C8A: main (in /home/UDRIVE/user/prog/a.out)
==20913==  If you believe this happened as a result of a stack
==20913==  overflow in your program's main thread (unlikely but
==20913==  possible), you can try to increase the size of the
==20913==  main thread stack using the --main-stacksize= flag.
==20913==  The main thread stack size used in this run was 8388608.
==20913==
==20913== HEAP SUMMARY:
==20913==     in use at exit: 10,928 bytes in 88 blocks
==20913==   total heap usage: 120 allocs, 32 frees, 85,440 bytes allocated
==20913==
==20913== LEAK SUMMARY:
==20913==    definitely lost: 48 bytes in 2 blocks
==20913==    indirectly lost: 624 bytes in 26 blocks
==20913==      possibly lost: 0 bytes in 0 blocks
==20913==    still reachable: 10,256 bytes in 60 blocks
==20913==         suppressed: 0 bytes in 0 blocks
==20913== Rerun with --leak-check=full to see details of leaked memory
==20913==
==20913== For counts of detected and suppressed errors, rerun with: -v
==20913== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
Segmentation fault

我已经开始在网上查看其他代码,但我似乎找不到任何暗示我所缺少的东西。

标签: c++valgrind

解决方案


推荐阅读