C++ union类型的成员是shared_ptr类型

最近在项目中考虑到使用  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明显是不合理的

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值