【疑惑】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 编辑 ]






