2013-05-11 58 views
3

我正在为自己实现一个跳过列表,并且我遇到了一些C++问题。 我有两种结构:返回指向结构体并访问其字段的指针C++

  1. 的skiplist的节点 - 它保持其int值,和一个指针指向其他节点的数组。

    struct node{ 
        int val; 
        node** next; 
    }; 
    
  2. 跳过列表,其中包含指向列表头部和尾部的指针(标记)。

    struct skiplist{ 
        node *head, *tail; 
    }; 
    

另外,我有,它返回一个指向skiplist结构(I使用该函数来初始化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()功能,但如果我想引用T中的skiplist他主要()通过访问skiplist->tail该程序崩溃。 我一直在寻找相关的帖子,但他们没有帮助我。

如上所述in a similar post我不应该遇到晃动指针,因为我使用new运算符来分配结构。 我将是任何提示感谢;)

+1

你不''从'createSkiplist()'返回'l'。 – 2013-05-11 09:47:14

+0

打开编译器警告,并停止浪费你的时间和其他人的时间。编译器会告诉你关于丢失的回报。 – 2013-05-11 10:24:06

回答

5

第一个问题:

不必返回从createSkipList()任何东西,这意味着你的程序未定义的行为。添加return声明:

skiplist* createSkipList(){ 
    skiplist* l = new skiplist; 
    // ... 
    return l; 
// ^^^^^^^^^ 
} 

每款C++ 11标准的6.6.3/2:

[...]流下的函数到底是相当于一回没有价值;这会导致在值返回函数中出现未定义的 行为。

问题二:

以类似帖子中提到的,因为我使用new运算符来分配结构我should't遇到悬摆指针[...]

不幸的是,你确实会遇到晃来晃去的指针。正如Angew in the comments提到的,你在这里做什么:

node* headNext[MAX_LEVEL]; //array of pointers 
listHead->next = headNext; 

是创建一个本地数组对象,让listHead->next点到它的第一要素,没有考虑到数组(以及对象包含)将在createSkipList()返回时销毁 - 自动存储持续时间的对象在超出范围时会被销毁。

此外,作为一般建议,考虑使用智能指针进行所有权建模,而不是通过原始指针newdelete进行手动内存管理。

+1

更不用说'listHead-> next'被设置为指向一个局部变量,并且一旦函数退出就会变得悬而未决。 – Angew 2013-05-11 09:51:35

+0

@Angew:正确,我停在第一个问题;)谢谢你提到它,我将它添加到答案 – 2013-05-11 09:52:26

+0

@第一个问题 我不够注意在代码片段中省略return语句。当然你是对的,并感谢你对此发表评论。 @第二个问题: 我改变了创建数组的行,现在它工作正常。 ) 如果有人遇到类似的问题: 'node ** headNext = new node * [MAX_LEVEL];' 现在在函数退出后数组不会丢失。 – 2013-05-11 11:10:17