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

[问题]一个可以在VS上通过而6.0上不行的程序,求原因。。thx

yu4659
2015/4/3镜像同步7 回复
一个很奇怪的问题,下面的代码我可以在VS运行通过,但是在6.0中,加粗的部分赋的值不正确,求告诉原因和解决办法。。。谢谢 #include <queue> #include <stack> #include <exception> using namespace std; template <typename T> class CQueue { public: CQueue(void); ~CQueue(void); // 在队列末尾添加一个结点 void appendTail(const T& node); // 删除队列的头结点 T deleteHead(); private: stack<T> stack1; stack<T> stack2; }; template <typename T> CQueue<T>::CQueue(void) { } template <typename T> CQueue<T>::~CQueue(void) { } template<typename T> void CQueue<T>::appendTail(const T& element) { stack1.push(element); } template<typename T> T CQueue<T>::deleteHead() { if(stack2.size()<= 0) { while(stack1.size()>0) { T& data = stack1.top(); stack1.pop(); stack2.push(data); } } if(stack2.size() == 0) throw new exception("queue is empty"); T head = stack2.top(); stack2.pop(); return head; } void Test(char actual, char expected) { if(actual == expected) printf("Test passed.\n"); else printf("Test failed.\n"); } int main() { CQueue<char> queue; queue.appendTail('a'); queue.appendTail('b'); queue.appendTail('c'); char head = queue.deleteHead(); Test(head, 'a'); return 0; }
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
yu4659机器人#1 · 2015/4/3
自己又查看了下代码,在6.0中,貌似是因为当一个栈为空时, T& data = stack1.top(); stack1.pop(); stack2.push(data); 上面第三行的执行,是无法把第一行的data值存入栈2的,到这点就又不明白的。。 知道自己非常小白。。但是依然希望大神们能指导一下。。。谢谢了
yu4659机器人#2 · 2015/4/3
找到原因了,栈pop操作在vs中不自动释放栈的内存,6.0中释放了 这只是我单步加打印调试的结论。。。具体想查下是不是因为这个,还有pop操作的内存管理情况也不知道去哪儿查,。。。 大神们有路过的希望能说说吧。。
nuanyangyang机器人#3 · 2015/4/3
别用vc6.0了。我最后一次用vc6.0还是上小学的时候
yu4659机器人#4 · 2015/4/3
。。。。哦。。那。。我还是想问问。。所以pop的实现是当只有一个值在栈中的时候pop后不自动释放内存是不。。。要不vs怎么通过了呢。。 还是说象你另一个帖子里说的,啥根据系统、编译器都有关系,不关pop毛事?。。 编译器的改进?????? 【 在 nuanyangyang 的大作中提到: 】 : 别用vc6.0了。我最后一次用vc6.0还是上小学的时候
nuanyangyang机器人#5 · 2015/4/3
【 在 yu4659 的大作中提到: 】 : 。。。。哦。。那。。我还是想问问。。所以pop的实现是当只有一个值在栈中的时候pop后不自动释放内存是不。。。要不vs怎么通过了呢。。 : 还是说象你另一个帖子里说的,啥根据系统、编译器都有关系,不关pop毛事?。。 : 编译器的改进?????? 不要试图去假设pop是如何实现的,作为程序员,应该只依赖语言和库的接口规定的语义。不同的编译器、运行库可以用不同的方法实现。
yu4659机器人#6 · 2015/4/3
嗯。。每次看你的话都要看好多遍。。。十分受教。。十分感谢[em68] 【 在 nuanyangyang 的大作中提到: 】 : : 不要试图去假设pop是如何实现的,作为程序员,应该只依赖语言和库的接口规定的语义。不同的编译器、运行库可以用不同的方法实现。
BTup机器人#7 · 2015/4/6
T& data = stack1.top(); stack1.pop(); stack2.push(data); 这段代码是有问题的: LINE1:取栈顶元素,T&引用 LINE2:销毁栈顶元素,上述引用data就失效的 LINE3:往另一栈上加无效的元素,结果未知的 【 在 yu4659 的大作中提到: 】 : 自己又查看了下代码,在6.0中,貌似是因为当一个栈为空时, : T& data = stack1.top(); : stack1.pop(); : ...................