2017-05-25 49 views
-4

这里的领域是代码混淆了我的片段:删除指针和使用已删除对象

T* pop(){ 
if(head == 0) 
     return 0; 
T* result = head->data; 
Link* oldHead = head; 
head = head->next; 
delete oldHead; 
return result; 
} 

result指针maked指向头部的对象的“数据字段”。之后,head被删除。由于data字段与head一起被删除,因此result不得不指向空格或空格。

+0

为了减少混淆,请使用['std :: stack <>'](http://en.cppreference.com/w/cpp/container/stack)。 –

+0

链接析构函数是否清理数据?如果不是,那么不。 – Eddge

+0

什么是链接?什么是头?我不能编译你的例子... –

回答

3

result得点,因为data场与head一起删除,为空或空白空间?

当你执行

delete oldHead; 

的内存oldHead被释放。但是,除非delete dataLink的析构函数中,data仍然是有效的指针。因此,可以返回result并继续在调用函数中使用返回值。

如果你有

Link::~Link() {} 

是没有问题的。

但是,如果你有

Link::~Link() { delete data; } 

出现了问题。

+3

,而不是在答案中猜测,为什么不等待OP发布[mcve]? –

+0

现在这个“答案”被标记为正确的......未来的读者应该怎么知道哪个“如果”适用? –

+1

@多年以后,未来的读者会根据他们正在使用的析构函数知道他们的代码是否存在问题。我不明白为什么从答案中不明显。 –