返回信息流一个很奇怪的问题,下面的代码我可以在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;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #86352同步于 2015/4/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[问题]一个可以在VS上通过而6.0上不行的程序,求原因。。thx
yu4659
2015/4/3镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
自己又查看了下代码,在6.0中,貌似是因为当一个栈为空时,
T& data = stack1.top();
stack1.pop();
stack2.push(data);
上面第三行的执行,是无法把第一行的data值存入栈2的,到这点就又不明白的。。
知道自己非常小白。。但是依然希望大神们能指导一下。。。谢谢了
找到原因了,栈pop操作在vs中不自动释放栈的内存,6.0中释放了
这只是我单步加打印调试的结论。。。具体想查下是不是因为这个,还有pop操作的内存管理情况也不知道去哪儿查,。。。
大神们有路过的希望能说说吧。。
。。。。哦。。那。。我还是想问问。。所以pop的实现是当只有一个值在栈中的时候pop后不自动释放内存是不。。。要不vs怎么通过了呢。。
还是说象你另一个帖子里说的,啥根据系统、编译器都有关系,不关pop毛事?。。
编译器的改进??????
【 在 nuanyangyang 的大作中提到: 】
: 别用vc6.0了。我最后一次用vc6.0还是上小学的时候
【 在 yu4659 的大作中提到: 】
: 。。。。哦。。那。。我还是想问问。。所以pop的实现是当只有一个值在栈中的时候pop后不自动释放内存是不。。。要不vs怎么通过了呢。。
: 还是说象你另一个帖子里说的,啥根据系统、编译器都有关系,不关pop毛事?。。
: 编译器的改进??????
不要试图去假设pop是如何实现的,作为程序员,应该只依赖语言和库的接口规定的语义。不同的编译器、运行库可以用不同的方法实现。
嗯。。每次看你的话都要看好多遍。。。十分受教。。十分感谢[em68]
【 在 nuanyangyang 的大作中提到: 】
:
: 不要试图去假设pop是如何实现的,作为程序员,应该只依赖语言和库的接口规定的语义。不同的编译器、运行库可以用不同的方法实现。
T& data = stack1.top();
stack1.pop();
stack2.push(data);
这段代码是有问题的:
LINE1:取栈顶元素,T&引用
LINE2:销毁栈顶元素,上述引用data就失效的
LINE3:往另一栈上加无效的元素,结果未知的
【 在 yu4659 的大作中提到: 】
: 自己又查看了下代码,在6.0中,貌似是因为当一个栈为空时,
: T& data = stack1.top();
: stack1.pop();
: ...................