blc*_*llo 8 c++ pointers linked-list
我有一项任务要求我们实现双向链表类.出于某种原因,他们将节点定义struct如下:
struct node {
node *next;
node *prev;
T *o;
};
Run Code Online (Sandbox Code Playgroud)
在我看来,如果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;
}
Run Code Online (Sandbox Code Playgroud)
在使用ddd进行调试的时候,我意识到第一次插入数字时一切正常,但第二次绕过一切都搞砸了,因为一旦你将'val'设置为新元素,它就会"覆盖"第一个自记忆以来使用了val的地址.我尝试做其他事情,而不是只是让'val'变量执行以下操作:
T *valp = new T;
T val;
valp = &val;
val = *o;
np->o = valp
Run Code Online (Sandbox Code Playgroud)
这似乎也没有用.我认为这是因为它只是一个更复杂的形式,我上面做的只是额外的内存泄漏:)
任何正确方向的想法/指针都会很棒.
在T val您创建一个自动变量.你的错误是将地址存储到该堆栈变量中.
您应该使用new在堆上分配空间,如您所怀,但您的数据指针需要直接指向返回的地址new.
您最近尝试的错误在于:
valp = &val;
Run Code Online (Sandbox Code Playgroud)
您正在改变valp,以指向别处(val的地址),当你可能想复制VAL的数据,而不是它的地址.
传递给您的函数的数据应该复制到新的内存valp点.
| 归档时间: |
|
| 查看次数: |
1262 次 |
| 最近记录: |