我正在为自己实现一个跳过列表,我遇到了一些C ++问题。 我有两种结构:
skiplist的一个节点 - 它保存了int值,并指向指向其他节点的指针数组。
struct node{
int val;
node** next;
};
跳过清单,指向列表的头部和尾部(哨兵)。
struct skiplist{
node *head, *tail;
};
另外,我有一个函数返回一个指向skiplist结构的指针(我使用这个函数来初始化skiplist):
skiplist* createSkipList(){
skiplist* l = new skiplist;
node* listHead = new node;
node* listTail = new node;
node* headNext[MAX_LEVEL]; //array of pointers
listHead->next = headNext;
for(int i=0; i<MAX_LEVEL; i++){
listHead->next[i] = listTail;
}
l->head=listHead;
l->tail=listTail;
}
在main()函数中我调用:
skiplist* skiplist=createSkipList();
createSkipList()
函数中的一切正常,但如果我想引用main()中的skiplist,即访问skiplist->tail
程序崩溃。
我一直在寻找相关的帖子,但他们没有帮助我。
如上所述in a similar post我不应该经历悬空指针,因为我使用new
运算符来分配结构。
我会很感激任何提示;)
答案 0 :(得分:5)
第一个问题:
您没有从createSkipList()
返回任何内容,这意味着您的程序有未定义的行为。添加return
声明:
skiplist* createSkipList(){
skiplist* l = new skiplist;
// ...
return l;
// ^^^^^^^^^
}
根据C ++ 11标准的第6.6.3 / 2段:
[...]离开函数末尾相当于没有值的返回;这导致未定义 价值回归函数中的行为。
第二个问题:
正如在类似的帖子中所提到的,我不应该经历悬空指针,因为我使用new运算符来分配结构[...]
不幸的是,你确实遇到悬空指针。正如Angew in the comments所提到的,你在这里做的是什么:
node* headNext[MAX_LEVEL]; //array of pointers
listHead->next = headNext;
创建本地数组对象并让listHead->next
指向它的第一个元素,而不考虑数组(以及它包含的对象)将被销毁一次{{ 1}}返回 - 具有自动存储持续时间的对象在超出范围时会被销毁。
此外,作为一般建议,请考虑使用智能指针来建模所有权,而不是通过原始指针createSkipList()
和new
进行手动内存管理。