双链表实现中的"Conditional jump or move depends on uninitialised value"

"Conditional jump or move depends on uninitialised value" in double linked list implementation

本文关键字:move depends on value uninitialised or Conditional 实现 链表 jump      更新时间:2023-10-16

Valgrind告诉我两个我无法解决的错误。我得到一个"有条件的跳转或移动取决于未初始化的值"错误信息在以下函数unplug_set。是因为NULL支票的原因吗?该函数应该从双链表中拔出一个元素。

void unplug_set(set * set_to_unplug){
        set * last_set = set_to_unplug->last;
        set * next_set = set_to_unplug->next;
        set_to_unplug->next = NULL;
        set_to_unplug->last = NULL;
148     if(last_set == NULL && next_set == NULL){ // only one element left
          ordered_by_score_set[set_to_unplug->weight] = NULL;
150     }else if(last_set == NULL){ // first set
          next_set->last = NULL;
          ordered_by_score_set[set_to_unplug->weight] = next_set;
        } else if (next_set == NULL) { // last set
          last_set->next = NULL;
        } else { // set in the middle
          last_set->next = next_set;
        next_set->last = last_set;
       }
}
Valgrind命令:
valgrind --dsymutil=yes --track-origins=yes ./set_program
输出:

==45085== Conditional jump or move depends on uninitialised value(s)
==45085==    at 0x100001A2C: unplug_set(set*) (:148)
                          ...
==45085==    by 0x100001294: main (Main.cpp:81)
==45085==  Uninitialised value was created by a heap allocation
==45085==    at 0xC713: malloc (vg_replace_malloc.c:274)
==45085==    by 0x63346: operator new(unsigned long) (in /usr/lib/libstdc++.6.0.9.dylib)
==45085==    by 0x100001E0C: add_set(int, int, unsigned int const*, unsigned short const*, int, unsigned int const*) (:57)
==45085==    by 0x10000127E: main (Main.cpp:39)
==45085==
==45085== Conditional jump or move depends on uninitialised value(s)
==45085==    at 0x100001A60: unplug_set(set*) (:150)
                          ...
==45085==    by 0x100001294: main (Main.cpp:81)
==45085==  Uninitialised value was created by a heap allocation
==45085==    at 0xC713: malloc (vg_replace_malloc.c:274)
==45085==    by 0x63346: operator new(unsigned long) (in /usr/lib/libstdc++.6.0.9.dylib)
==45085==    by 0x100001E0C: add_set(int, int, unsigned int const*, unsigned short const*, int, unsigned int const*) (:57)
==45085==    by 0x10000127E: main (Main.cpp:39)

set_to_unplug参数值由其构造函数使用new操作符初始化。如果构造函数中没有初始化,那么你就有了valgrind报错的原因。

我们没有足够的资料来回答你的问题。张贴如何使用此功能。以及如何初始化参数值