【问题标题】:Heap corruption in my skip list我的跳过列表中的堆损坏
【发布时间】:2015-02-01 06:23:34
【问题描述】:

当我在我的int main()return 0; 时,我的跳过列表实现遇到了这个问题,我遇到了堆损坏。这至少是我调试到的地方,直到它崩溃。

这是我的代码:

skipnode.h

template <typename T>
class SkipNode
{
public:
    T data;
    SkipNode<T> **next;
    SkipNode(T d, int level);
    ~SkipNode();
};

skipnode.cpp

#include "skipnode.h"

template<typename T>
SkipNode<T>::SkipNode(T d, int level)
{
    data = d;
    next = new SkipNode<T>*[level];

    for (int i = 0; i < level; i++)
        next[i] = 0;
}

template<typename T>
SkipNode<T>::~SkipNode()
{
    delete [] next;
}

skiplist.h

#include "skipnode.cpp"

#define MAXLEVEL 4

template<typename T>
class SkipList
{
public:
    SkipList();
    ~SkipList();
    int randLvl(int max);
    T search(T);
    void insert(T);
private:
    SkipNode<T> *root; 
};

skiplist.cpp

#include "skiplist.h"
#include <stdlib.h>
#include <time.h>

template<typename T>
SkipList<T>::SkipList()
{
    root = new SkipNode<T>(0,MAXLEVEL);
}

template<typename T>
SkipList<T>::~SkipList()
{
    delete root;
}

template<typename T>
int SkipList<T>::randLvl(int max)
{
    srand(time(NULL));
    return rand() % max + 1; //+ 1, så værdien ikke bliver 0
}

template<typename T>
void SkipList<T>::insert(T value)
{
    int level = randLvl(MAXLEVEL);

    SkipNode<T> *insertNode = new SkipNode<T>(value,level);
    SkipNode<T> *currentNode = root;

    for (int i = level; i > 0; i--)
    {
        for (; currentNode->next[i] != 0; currentNode = currentNode->next[i])
        {
            if (currentNode->next[i]->data > value)
                break;
        }
        if (i <= level)
        {
            insertNode->next[i] = currentNode->next[i];
            currentNode->next[i] = insertNode;
        }
    }
}

main.cpp

#include "skiplist.cpp"

int main()
{
    SkipList<int> SList;
    SList.insert(3);
    return 0;
}

我有一个理论,错误可能发生在skiplist.cpp中的这一行:

if (currentNode->next[i]->data > value)

因为它似乎无法访问下一个->数据,但我不知道为什么。

谁能帮帮我?抱歉,如果我问错了问题,我对 Stack Overflow 还是有点陌生​​。提前致谢!

【问题讨论】:

  • 与崩溃无关,但不断为您的 RNG 播种时间意味着它会一遍又一遍地返回相同的数字,直到时间改变,这可能不是您想要的。
  • 嗯,它产生不同的输出。也许我不太明白你的意思?
  • 你确定吗? time 返回一个 time_t,在大多数平台上,它是自纪元以来的秒数。你正在用它播种一个伪随机数生成器,所以它应该返回相同的数字,直到时钟改变到下一秒。
  • 刚刚测试过了。输出:4、3、3、1、2、4、1。看起来可行:)
  • “在我的电脑上工作”,嗯。

标签: c++ heap-corruption


【解决方案1】:

insert(T) 的 for 循环中有一个 off-by-one error,它可能应该是

for (int i = level-1; i &gt;= 0; i--)

还有insert()会泄露内存,删除insertNode

【讨论】:

    【解决方案2】:

    也许试试 gflags,看看这个答案:

    https://stackoverflow.com/a/2476077/3986139

    启用 gflags 后,您可以在堆损坏时在 VS 中获取异常,而不是事件后的异常

    【讨论】:

      猜你喜欢
      • 2020-01-15
      • 2013-02-18
      • 2013-09-29
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 2018-10-31
      • 2010-10-11
      相关资源
      最近更新 更多