尝试在使用互斥锁时引用已删除的函数
Attempting to reference a deleted function when using a mutex
我在处理项目时遇到一个奇怪的错误。 我创建了一个超级简单的示例来重现错误。
我创建了一个类。 我想在本课程中做的是为我的类提供一种"getter"函数来填充struct
的值。 在主应用程序中,用户将实例化此struct
,将其传递给成员函数,并能够在返回时读取struct
中的值。 由于实际类的设计,这必须在单独的线程中进行。 这是我所拥有的:
myClass.h:
#ifndef __MY_CLASS_H__
#define __MY_CLASS_H__
#include <mutex>
class myClass {
public:
struct my_struct_s {
int field1;
short field2;
};
int get_data(my_struct_s & my_struct);
private:
};
#endif /* __MY_CLASS_H__ */
我的类.cpp:
#include "myClass.h"
int myClass::get_data(struct my_struct_s & my_struct)
{
int var1 = 5;
char var2 = 2;
my_struct.field1 = var1;
my_struct.field2 = var2;
return 0;
}
主.cpp:
#include "myClass.h"
#include <iostream>
#include <thread>
#include <Windows.h>
bool thread_running;
std::thread thread;
void run_thread(myClass & lmyClass)
{
myClass::my_struct_s my_struct;
while (thread_running) {
lmyClass.get_data(my_struct);
std::cout << my_struct.field1 << std::endl;
std::cout << my_struct.field2 << std::endl;
Sleep(100);
}
}
int main(int argc, char *argv[])
{
myClass lmyClass;
thread_running = true;
thread = std::thread(run_thread, lmyClass);
Sleep(1000);
thread_running = false;
if (thread.joinable()) {
thread.join();
}
getchar();
return 0;
}
它按预期工作。 但是,由于类的异步性质,我需要互斥锁来保护在类内不同线程中处理的数据。
如果我将std::mutext
添加为类的私有成员,则在尝试运行代码时会收到以下内容:
Error 1 error C2280: 'std::mutex::mutex(const std::mutex &)' : attempting to reference a deleted function ...
1)我试图了解为什么会收到此错误。
2)(这部分更基于意见),给定信息,这种"getter"方式是否填写公共结构,以便实现我的类的人可以弄乱其中的变量是一个好的设计? 有没有更好的方法?
你在myclass
中没有复制构造函数,所以编译器给了它一个默认的复制构造函数。这将尝试复制所有成员,包括您的std::mutex
,这是不可复制的。正如编译器错误所说,它被标记为已删除。
您需要定义自己的复制构造函数;很可能您希望它获取存储在要复制的实例中的互斥锁,然后将其所有其他成员复制到新实例中。
动态而非静态声明互斥锁。
在你的 myClass 类头上,将互斥锁声明为指针,如下所示:
mutex * mtx;
并在构造函数中初始化调用其构造函数的互斥体:
mtx = new std::mutex();
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- C++ 尝试在不存在的构造函数中引用已删除的函数(使用 rapidJson)
- 为什么通过 vector<reference_wrapper> 的元素删除引用的值<T>不会使向量无效?
- 在引用初始化中使用已删除的复制构造函数进行复制初始化
- CMake 引用我在 ~/bin 中创建的随机 shell 脚本(即使我删除了它)?
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 使用函数引用指向节点的指针删除链表中的节点?
- unique_ptr实现接口时对已删除函数的引用
- 无法引用该函数" std:: variant <_Types...> operator =",因为此函数已被删除
- 从尝试引用已删除函数的矢量 C++ 中删除对象
- unique_ptr,您引用的是已删除的函数
- 试图引用已删除函数数组的相等运算符
- 错误:在类型 "blah blah" 的绑定引用中删除限定符以初始化"some other blah blah"
- 使用 future 时获取 C2280(尝试引用已删除的函数)
- 删除通过取消引用新对象初始化的对象
- C++引用已删除函数错误
- 是否可以删除取消引用的指针
- 尝试引用已删除的函数
- 如何在C++上使用对象引用删除对象
- BOOST共享指针导致冗余引用删除