在C ++中的双链表
我有一项任务,要求我们实施一个双链表类。 出于某种原因,他们如下定义节点struct
:
struct node {
node *next;
node *prev;
T *o;
};
在我看来,如果struct成员的'data'不是一个指针,写这个类会容易得多。 不用说我不能改变它,所以我将不得不解决它。 我尝试实现将元素添加到列表开头的方法,如下所示:
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
这似乎也没有工作。 我认为这是因为它只是一个更复杂的形式,我做了上面的只是一个额外的内存泄漏:)
任何正确方向的想法/指针都会很棒。
你创建的T val
是一个自动变量。 您的错误是将地址存储到该堆栈变量。
正如你怀疑的那样,你应该使用new
来分配堆上的空间,但是你的数据指针需要直接指向由new
返回的地址。
您最近一次尝试的错误在这里:
valp = &val;
当你想要复制val的数据 ,而不是地址时,你正在改变valp
指向别的地方 ( val的地址)。
传递给你函数的数据应该被复制到valp
指向的新内存中。
我不认为你应该这样做:
T val = *o;
由于节点结构中的o
成员是一个指针,并且insertFront
的参数也是一个指针,所以您的指导者可能打算让您获取指定的指针并将其存储在列表中,而不是创建对象的副本并存储一个指针。 只需将传入到insertFront
的o
指针存储为节点的o
成员,并且您应该没问题。
T val = *o;
np->o = &val;
这部分是可疑的。 提示是,一旦函数超出范围,函数中堆栈上分配的内存将不可用。
链接地址: http://www.djcxy.com/p/82473.html