C++ Error C2280 尝试引用已删除的函数(二)因std::mutex引起的拷贝

我最近做的项目用到了C++11的多线程库,其中一个类A中有一个类B的成员,而类B的成员中使用到了std::mutex互斥锁,这个互斥锁在B中使用没有任何问题,但是当类B成为一个类A的成员之后,就出现了问题,

1>e:\workqt\spotdetect\detectviewer.cpp(5): error C2280: “Detector::Detector(const Detector &): 尝试引用已删除的函数
1>e:\workqt\spotdetect\detector.h(97): note: 编译器已在此处生成“Detector::Detector”
1>e:\workqt\spotdetect\detector.h(97): note: “Detector::Detector(const Detector &): 因为 数据成员 调用已删除或不可访问的函数“std::mutex::mutex(const std::mutex &)”,所以已隐式删除函数 (编译源文件 detectviewer.cpp)
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\mutex(91): note: “std::mutex::mutex(const std::mutex &): 已显式删除函数 (编译源文件 detectviewer.cpp)

对这个问题一度很迷茫,最后查了半天,是因为包含关系导致的,类A中有一个类B的成员,类B中有一个互斥锁,而查看std::mutex源代码,mutex的拷贝构造函数是被delete的,不允许拷贝构造,然而在类A的构造函数中,调用类B的构造函数,然后将其赋值到类A的对应类B这个成员变量下,这个赋值,就会调用类B的赋值运算符,而我没有去特殊定义,这样就会调用编译器生成的默认拷贝赋值运算符,将B中的数据逐bit拷贝,而拷贝B中的mutex的时候,就会报编译错误error C2280。

所以根据这样的情况,总结几种解决方案:
1.在类包含类的情况下,不要在被包含的类中使用std::mutex。
2.重写类B的赋值运算符,拷贝除了mutex以外的其他数据成员,重新构造一个新的mutex给拷贝过去的对象使用。
3.类B中的mutex可以改为一个指向mutex的指针或者shared_ptr,这样触发默认赋值运算符的时候,拷贝的就是指针,指针本身可以拷贝,也可解决问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值