在成员函数上启动线程时调用不需要的析构函数

时间:2016-02-08 13:38:23

标签: c++ multithreading c++11

我的main函数中有一个事件循环,我想创建一个对象并在对象的成员函数上运行一个线程。但是,我注意到在线程启动之前对象被销毁了。我不明白为什么。

我的代码:

#include <iostream>
#include <thread>

class MyClass {
public:
    MyClass(){
        std::cout << "MyClass constructor is called" << std::endl;
    }
    ~MyClass(){
        std::cout << "MyClass destructor is called" << std::endl;
    }    
    void start(){
        std::cout << "MyClass is starting" << std::endl;
    }
};

int main()
{
        MyClass mine;
        std::thread t(&MyClass::start, mine);
        t.join();
}

输出:

MyClass constructor is called
MyClass destructor is called
MyClass is starting
MyClass destructor is called
MyClass destructor is called

期望的输出:

MyClass constructor is called
MyClass is starting
MyClass destructor is called

2 个答案:

答案 0 :(得分:10)

通过引用传递minestd::thread t(&MyClass::start, std::ref(mine)); mine的类型为MyClass,表示您按值传递它。所以std::thread将其副本传递给新创建的主题。

您需要通过引用明确告诉您传递mine的模板。

答案 1 :(得分:3)

std::thread在内部创建本地对象并多次调用复制构造函数,并在使用后销毁本地对象。因此,您将获得多个输出MyClass destructor is called。 如果要检查对象构造的行为,则可以在类中包含复制构造函数。