【问题标题】:C++ 11 : thread creation giving me a "Attempt to use a deleted function" errorC++ 11:线程创建给了我“尝试使用已删除的函数”错误
【发布时间】:2018-03-12 12:28:53
【问题描述】:

我是线程处理的新手,我有点困惑为什么这段代码不起作用:

// Note that the GKITH object is useful for my whole code
void thread_function( gkit2light_Handler*& GKITH )
{
    std::cout << "\t~ Writing from gkit2light thread..." << std::endl;
}

int main( int argc, char** argv )
{

    // Custom gkit2light Handler
    gkit2light_Handler *gkit_handler = new gkit2light_Handler( );

    // Launching thread...
    std::thread gkit_thread( thread_function, gkit_handler );

    return 0;

}

我使用 XCode 9 在 macOS 10.13 下运行它。 这些行实际上都没有给我一个错误,但我的编译器给了我这个消息:«尝试使用已删除的函数»。 这很奇怪,因为这里的 thread_function() 只访问标准输出...

这里是删除的功能,也许对你有帮助!

struct __nat
{
#ifndef _LIBCPP_CXX03_LANG
    // ...

    // This is the destructor that is throwing the error
    ~__nat() = delete;
#endif
}; 

这是错误的屏幕截图(没有更多信息): XCode compiler error screenshot

【问题讨论】:

  • 编译器抱怨哪一行? (请edit该问题包含整个编译器错误消息。)
  • 好吧,我需要为并行计算(图像处理)创建一个线程,但是因为我遇到了这个错误,我试图简化代码并以这个结束,仍然给我同样的错误!跨度>
  • 你错了。那里有额外的信息。哪个是main.cpp 第 9 行? (另外,请学习如何显示实际的编译器输出,而不是将其复制到问题中。)

标签: c++ multithreading


【解决方案1】:

在将参数传递给thread 时,您不能像这样绑定引用(这在at least one reference 中有说明)。要传递引用,请使用 std::ref 包装它。这将在这些参数发生的移动/复制中继续存在。

工具链抛出如此神秘的错误消息令人遗憾,但这意味着在其模板元编程的某个地方,它正在尝试实例化与您编写的代码相关的一些模板,但未能实例化。

【讨论】:

  • 但就像您自己指出的那样,它是一个指针。复制指针不应该调用任何析构函数,对吧?
  • @Default:它没有,但是在 std::thread 的极其复杂的机制中的某个地方,以及与之相关的一切,与做不可能的事情相关的一些模板的实例化导致了这个错误。它不是指针参数,而是引用参数,您不能“复制引用”。我们可以追踪整个事件链,但只有在真正无聊的时候。
  • 啊,那是因为函数参数列表?参数gkit2light_Handler* GKITH(没有&amp;)也许不会触发它?
  • @Default:这就是我的猜测。如果您可以删除&amp; 并且问题仍然存在,那么我知道发生了什么:)
  • 我未能为我提供的目标函数包含所需数量的参数,从而成功触发了这个相当无意义的错误消息。
猜你喜欢
  • 2020-03-26
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 2015-05-25
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多