【发布时间】:2010-12-25 13:07:47
【问题描述】:
我有一个任务要求我们实现一个双向链表类。出于某种原因,他们将节点 struct 定义如下:
struct node {
node *next;
node *prev;
T *o;
};
在我看来,如果结构成员“数据”不是指针,编写类会容易得多。不用说我无法改变它,所以我将不得不解决它。我尝试实现将元素添加到列表开头的方法,如下所示:
template <typename T>
void Dlist<T>::insertFront(T *o) {
node *np = new node;
T val = *o;
np->o = &val;
np->prev = NULL;
np->next = first;
if (!isEmpty()) {
first->prev = np;
} else {
last = np;
}
first = np;
}
在使用 ddd 进行调试时,我意识到第一次插入数字时一切正常,但第二次时一切都搞砸了,因为一旦将 'val' 设置为新元素,它就会“覆盖”第一个元素因为使用了 val 的内存地址。我尝试做其他事情,而不是让 'val' 变量执行以下操作:
T *valp = new T;
T val;
valp = &val;
val = *o;
np->o = valp
这似乎也不起作用。我认为这是因为它几乎只是我上面所做的更复杂的形式,只是额外的内存泄漏:)
任何正确方向的想法/指针都会很棒。
【问题讨论】:
-
+1 荣誉作业免责声明。
-
看看这个,第一个答案可能会帮助你理解问题:stackoverflow.com/questions/5727/…
-
如果有机会也可以看看这个:stackoverflow.com/questions/599308/… -- 堆栈和堆分配之间的区别。
标签: c++ pointers linked-list