假设定义了一个正确的stack<Type> template,一个简单的堆。
三个容易出错的范例:
stack<char*> st; 版本1: string po; 替换为: char* po;
旨在使用char指针而不是string对象来接受键盘的输入。这种方法失败的原因是,char指针仅仅是创建了指针(4字节大小),没有非配任何用于保存输入字符的空间。程序编译通过,但是运行时出现segment error。
版本2: string po; 替换为: char po[40];
这里为输入的字符分配了space,另外po的type是char*,因此可以被放在堆栈中。但是数组完全和pop方法的假设相冲突。
template<typename T> bool stack<T>::pop(T &item) { if(top>0) { item=items[--top]; return true; } else return false; }
首先,引用变量item必须引用某种类型的左值,而不是数组名。其次,代码假设可以给item赋值,即使item能够引用数组,也不能为数组名赋值。
(这样的说法不是很懂,请高手指点。。。。。)
版本3: string po; 替换为: char *po=new char[40];
这位输入的字符串分配了空间。另外,po是变量,因此与pop的代码兼容。不过,po变量只有一个,总是指向相同的地址空间(neicunspace),当入stack得时候,都是讲数值插入到正确的地方,数值也正常,但是所有的stack单元都是指向同一块地址,因此不管插入多少,所有的stack单元存放的都是最后一个插入的数值。当输出时,取得的value都是同一个(最后插入的)。具体的说,堆栈并没有保存每一个新的字符串,因此没有任何用途。
解决方法:请参考http://blog.csdn.net/likun_tech/article/details/7277601这篇博文。
1、使用指针数值。