最近在项目中考虑到使用 union 类型,而且要在union类型中使用shared_ptr,就自己做了一个小测试
C++的union 和C语言的区别还是比较大de
代码如下,使用 union 装vector 、 shared_ptr 等类类型, 必须实现构造函数和析构函数,供大家参考
#include <iostream>
#include <memory>
#include <vector>
class Data
{
public:
Data(int a ):_a(a)
{
}
Data(const Data & other):_a(other._a)
{
std::cout<<"copy constructor called "<<other._a<<std::endl;
}
~Data()
{
std::cout<<"Data destroyed"<<std::endl;
}
int getData() const
{
return _a;
}
private:
int _a;
};
typedef std::shared_ptr<std::vector<Data> > DataPtr;
typedef std::vector<Data>::iterator Iterator;
union smartPtrU
{
smartPtrU()
{
new (&this->data_ptr) DataPtr;
}
~smartPtrU()
{
this->data_ptr.~shared_ptr();
}
DataPtr data_ptr;
};
int main(int argc, char** argv) {
smartPtrU su;
su.data_ptr = std::make_shared<std::vector<Data>>();
Data d1(100);
Data d2(200);
su.data_ptr->push_back(d1);
su.data_ptr->push_back(d2);
for (Iterator it = su.data_ptr->begin(); it != su.data_ptr->end(); it++)
{
std::cout<<it->getData()<<std::endl;
}
return 0;
}
上边的是有一些问题的,在构造函数里边直接构造了shared_ptr对于union类型的主要成员是其他类型的数据来说,就是不合理的,因为在激活成员不是shared_ptr的情况下,构造和析构shared_ptr明显是不合理的