【发布时间】: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