>我正在尝试创建一个函数,该函数将创建一个新的链表,给定一个指向整数数组的指针。
这是我的代码,更多信息如下:
#include "iostream"
using namespace std;
//Definition for singly-linked list.
struct ListNode {
//members
int val;
ListNode *next;
//constructor
ListNode(int x) : val(x), next(NULL) {}
//overload assignment operator
void operator=(const ListNode &right_list ) {
val = right_list.val;
next = right_list.next;
}
};
//error here:
//creating new linked list
ListNode* createNewList(int* x, int length) {
if (*x == NULL) return NULL;
ListNode newList = ListNode(-1);
ListNode* ptr = &newList;
int count = 0;
while (count < length) {
ptr->val = *(x + counter);
ListNode newElement = ListNode(-1);
ptr->next = &newElement;
ptr = ptr->next;
counter++;
}
ListNode* returnPtr = &newList;
return returnPtr;
}
int main() {
//create List contents
int x [5] = {2, 4, 5, 7, 9};
int* y = x;
//create list: doesn't work.
ListNode* newList = createNewList(y, 5);
cout << "debug test: neList first val is " << newList->val << endl;
return 0;
}
使用 gdb,我发现错误在线:
ptr->next = &newElement;
在 while 循环之后,列表包含元素 {2, -1, -1, -1, -1}。我相信这是因为我只是在newElement的地址旁边设置ptr->,而不是创建一个与newElement相同的ListNode的新实例并在它旁边设置ptr->。
但我认为为了避免这种情况,并确保"="符号产生深层副本,我只需要重载 ListNode 类中的赋值运算符,我做到了。
此外,在 createNewList fn 结束之前,returnPtr->val 的值为 2(我用 gdb 验证了这一点(,但 cout 语句每次打印不同的值,因此它是某种形式的未定义行为。我不明白原因。
如果我研究并发现任何新的东西,我会分享。我还可以根据要求提供更多信息。我真的很想了解指针移动语义,因此链接到可能适用的其他情况或文章将大有帮助:)
感谢您阅读:)任何信息不胜感激!
您正在堆栈上创建列表元素,因此一旦您离开函数,它们就会消失。
而不是
ListNode newElement = ListNode(-1);
尝试
ListNode* newElement = new ListNode(-1);
例如
ListNode* createNewList(int* x, int length) {
if (x == nullptr) return x;
ListNode* newList = new ListNode(-1);
ListNode* ptr = newList;
int count = 0;
while (count < length) {
ptr->val = *(x + counter);
ListNode* newElement = new ListNode(-1);
ptr->next = newElement;
ptr = ptr->next;
counter++;
}
return newList;
}
这是不必要的
int x [5] = {2, 4, 5, 7, 9};
int* y = x;
//create list: doesn't work.
ListNode* newList = createNewList(y, 5);
你可以直接传递 x
ListNode* newList = createNewList(x, sizeof(x)/sizeof(*x));
为什么不
std::list<int> newlist {x, x+length};