【疑惑】C++句柄类(不同容器在不同系统下结果不同!)
程序代码:
#include<iostream> #include<string> #include<vector> #include<list> using namespace std; class base_item { public: virtual void print(){cout<<"This is base_item!"<<endl;} virtual base_item* clone(){return new base_item(*this);} }; class inher_item1:public base_item { public: void print(){cout<<"This is inher_item1!"<<endl;} inher_item1* clone(){return new inher_item1(*this);} }; class inher_item2:public inher_item1 { public: void print(){cout<<"This is inher_item2!"<<endl;} inher_item2* clone(){return new inher_item2(*this);} }; class handle { private: base_item* pointer; public: handle():pointer(NULL){} handle(base_item* p_object):pointer(p_object){} ~handle(){delete pointer;} base_item* operator->(){return pointer;} base_item& operator*(){return *pointer;} handle& operator=(const handle& para){pointer=para.pointer;return *this;} handle(const handle& para){pointer=para.pointer;} }; int main() { base_item base_; inher_item1 inher_1; inher_item2 inher_2; handle handle_class1(base_.clone()); handle handle_class2(inher_1.clone()); handle handle_class3(inher_2.clone()); vec<handle> vec_handle; vec_handle.push_back(handle_class1); vec_handle.push_back(handle_class2); vec_handle.push_back(handle_class3); vec<handle>::iterator ite_begin=vec_handle.begin(); vec<handle>::iterator ite_end=vec_handle.end(); for(;ite_begin!=ite_end;ite_begin++) { (*ite_begin)->print(); } return 0; }
c++ primer中有讲C++句柄类,于是我尝试模仿书本上的程序写了一小段程序!因为只是测试一下,所以我省略了对指针的管理!
但我尝试用vector容器来装句柄类的时候,如果通过迭代器来调用print()函数,在VS2008和mingw5下能编译通过,在windows下,出现不了结果,但出现下面的窗口
如果在linux下,在g++中同样可以通过,而运行的时候出现segmentation fault!
于是我换了list容器来装句柄类,同样通过迭代器来调用print(),同样在VS2008和mingw5下能编译通过,在windows下,可以出现结果,但系统同样会终止程序!
在linux下却可以正常运行!
我有怀疑handle类作为vector容器内元素的条件不足,但是我查了一下书,暂时了解到作为vector容器元素的约束条件只有1、必须是可以复制的 2、必须是支持赋值运算
但是handle类已经有复制构造函数和重载了赋值符号!究竟是哪方面的问题?
[ 本帖最后由 点解咁问 于 2011-12-28 20:14 编辑 ]