【发布时间】:2014-01-26 07:19:11
【问题描述】:
队列的目的是存储指向T 类型对象的指针。当我遍历各种数据结构时,队列用于将对象推入和移出队列。
队列工作正常,除了行:
out = t->payload;
(从底部算起四行)
out 永远不会改变 t->payload 中的值。在调试器中查看它,我可以看到 t->payload 设置正确,但 out 未分配 t->payload 中的值。谁能告诉我这是怎么回事?
template<typename T>
class Queue
{
private:
struct node
{
T *payload;
struct node *next;
};
node *head;
node *tail;
public:
Queue()
{
head = new node;
tail = new node;
head->next = tail;
tail->next = tail;
}
...
void push(T *payload)
{
node *newNode;
node *temp;
newNode = new node;
temp = head->next;
head->next = newNode;
newNode->next = temp;
newNode->payload = payload;
}
bool pop(T *out)
{
node *t;
node *x;
t = head;
x = head;
if(t == tail)
{
return false; //already empty
}
while(t->next != tail)
{
x = t;
t = t->next;
}
x->next = tail;
out = t->payload;
delete t;
return true;
}
}
【问题讨论】:
-
如何使代码漂亮。这太可怕了。
-
使用
<pre>和</pre>标签 -
我认为这里的问题是 delete t;在 pop() 中,因为它将调用默认析构函数,它将调用成员上的析构函数.. 意味着 out 指向无效内存.. 我的建议:要么使有效负载成为引用而不是指针,因为不应该无论如何都要改变......或者为你的结构实现一个析构函数,它不会删除有效负载,但将其设置为 nullptr,这意味着其他人(谁?)负责删除。
-
这个问题的minimal complete example 有十几行。