从析构函数调用线程的向量

Chuan Sun

为什么不能从析构函数调用线程向量?是否有使用析构函数的规则?

void p ()
{
    std::cout << "thread running " << std::endl;
}

class VecThreads // Error: In instantiation of member function 'std::__1::vector<std::__1::thread, std::__1::allocator<std::__1::thread> >::vector' requested here
{
public:
    std::vector<std::thread> threads;

    VecThreads() {
        threads.push_back(std::thread(p));
    }
    ~VecThreads()
    {
        threads[0].join();
    }
};

int main(int argc, const char * argv[]) {
    VecThreads h = VecThreads();
    //h.threads[0].join();  // delete deconstructor and use this works fine
  return 0;
}

我得到的错误:

调用类'std :: __ 1 :: thread'的私有构造函数

罗威

问题出在:

VecThreads h = VecThreads();

VecThreads没有move构造函数,因为它具有用户定义的destructor所以禁用了它的生成(即未声明因此,以上语句调用的副本构造函数。VecThreads

VecThreads包含类型为数据的成员std::vector<std::thread>–由于std::thread对象不可复制,因此不可复制。即使anstd::vector<std::thread>不可复制,它也是可移动的,因此从原理上讲,move构造函数可以解决问题。您可以通过在内部VecThreads的定义中添加以下内容来显式启用move构造函数的生成

VecThreads(VecThreads&&) = default;

自从C ++ 17起,您的原始代码就可以编译,无需进行任何修改,这要归功于必需的复制省略

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

向量擦除调用的错误析构函数

来自分类Dev

析构函数在C ++中调用向量

来自分类Dev

线程多次调用析构函数

来自分类Dev

析构函数调用

来自分类Dev

如果析构函数用于向量中的对象,是否将调用该析构函数?

来自分类Dev

智能指针析构函数调用的向量

来自分类Dev

从析构函数调用BeginInvoke

来自分类Dev

std:map析构函数会调用键析构函数还是值析构函数?

来自分类Dev

推入C ++向量时的构造函数和析构函数调用

来自分类Dev

使用析构函数进行线程连接

来自分类Dev

C ++在析构函数中杀死线程

来自分类Dev

在成员函数上启动线程时发生不希望的析构函数调用

来自分类Dev

线程例程函数中未调用局部变量析构函数?

来自分类Dev

如何在不调用析构函数的情况下使向量重新分配?

来自分类Dev

C#,删除带有子线程的对象时,GC没有调用析构函数

来自分类Dev

C ++中的析构函数直接调用

来自分类Dev

C ++:调用了错误的析构函数

来自分类Dev

避免析构函数调用特定异常

来自分类Dev

范围结束之前调用的析构函数

来自分类Dev

delete []是否调用析构函数?

来自分类Dev

使用delete调用析构函数

来自分类Dev

析构函数调用和指针

来自分类Dev

调用析构函数时出错

来自分类Dev

析构函数的调用量超出预期

来自分类Dev

显式调用析构函数

来自分类Dev

从列表中调用元素的析构函数

来自分类Dev

关于析构函数调用的困惑

来自分类Dev

手动调用析构函数

来自分类Dev

调用错误的析构函数