BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #39421同步于 2010/5/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

【求助】为什么delete后还能返回变量的引用?

lgsh
2010/5/20镜像同步6 回复
代码如下: template<class T> class Stack { private: class Node{ public: T*pItem; Node*pNext; Node(T&rItem):pItem(&rItem),pNext(0){} Node():pItem(0),pNext(0){} }; Node*pHead; public: Stack():pHead(0){} Stack(const Stack& aStack); ~Stack(); Stack& operator=(const Stack& aStack); void push(T& rItem); T&pop(); bool isEmpty(){return pHead==0;} }; template<class T> Stack<T>::Stack(const Stack& aStack){ pHead=0; if(aStack.pHead){ pHead=new Node(*aStack.pHead); Node*pOldNode=aStack.pHead; Node*pNewNode=pHead; while(pOldNode=pOldNode->pNext){ pNewNode->pNext=new Node(*pOldNode); pNewNode=pNewNode->pNext; } } } template<typename T> Stack<T>& Stack<T>::operator=(const Stack& aStack){ if (this=&aStack) return *this; Node*pTemp; while(pHead){ pTemp=pHead->next; delete pHead; pHead=pTemp; } if(aStack.pHead){ pHead=new Node(*aStack.pHead); Node*pOldNode=aStack.pHead; Node*pNewNode=pHead; while(pOldNode=pOldNode->pNext){ pNewNode->next=new Node(*pOldNode); pNewNode=pNewNode->pNext; } } return *this; } template<class T> Stack<T>::~Stack(){ Node*pTemp; while(pHead){ pTemp=pHead->pNext; delete pHead; pHead=pTemp; } } template<class T>void Stack<T>::push(T& aItem){ Node*pTemp=pHead; pHead=new Node(aItem); //pHead->pItem=&aItem; pHead->pNext=pTemp; } template<class T>T& Stack<T>::pop(){ T*pItem=pHead->pItem; Node*pTemp=pHead; pHead=pHead->pNext; delete pTemp; return *pItem; } 红色这里不是delete了pTemp了吗,为啥还能返回*pItem? 谢谢~~~
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
zzcc机器人#1 · 2010/5/20
指针只是指向一片内存,虽然内存中的东西部存在了,但是指针还是存在的啊 就好像大裤衩旁边那根东西烧掉了,但是路牌还是存在的一个道理
Ipjmc机器人#2 · 2010/5/20
【 在 zzcc 的大作中提到: 】 : 指针只是指向一片内存,虽然内存中的东西部存在了,但是指针还是存在的啊 : 就好像大裤衩旁边那根东西烧掉了,但是路牌还是存在的一个道理 : -- : ................... 如果整个页帧都被释放的话,还是会产生Page fault
lgsh机器人#3 · 2010/5/20
【 在 zzcc 的大作中提到: 】 : 指针只是指向一片内存,虽然内存中的东西部存在了,但是指针还是存在的啊 : 就好像大裤衩旁边那根东西烧掉了,但是路牌还是存在的一个道理 : -- : ................... 指针是存在啊,但是为啥他指向的item还能返回引用呢?
Ipjmc机器人#4 · 2010/5/20
【 在 lgsh 的大作中提到: 】 : : 指针只是指向一片内存,虽然内存中的东西部存在了,但是指针还是存在的啊 : : 就好像大裤衩旁边那根东西烧掉了,但是路牌还是存在的一个道理 : : -- : ................... 因为内存不是按字节分配的,而是按块分配的。即使释放了item,如果整个块没被释放的话,item还是可用的。但是一旦该块被释放的话,item就不能用了,所以你不能期望引用被释放的内存会产生怎样的后果,有可能正确,也有可能不正确。
lgsh机器人#5 · 2010/5/20
【 在 Ipjmc 的大作中提到: 】 : : : 指针只是指向一片内存,虽然内存中的东西部存在了,但是指针还是存在的啊 : : : 就好像大裤衩旁边那根东西烧掉了,但是路牌还是存在的一个道理 : : : -- : ................... 谢谢大家了。。。 也就是说这样的返回按道理是不能的,只是结果能够显示而已?
potatossss机器人#6 · 2010/5/20
哎。。这个楼从1楼开始就歪了啊 没仔细看代码,但是基本的不就是一个链表实现堆栈的代码吗?pTemp指向链表的一个节点而已,而pItem指向的是这个节点存放的值的地址啊。。他俩都不是一个东西,为什么不能呢?