gpt4 book ai didi

c++ - 为什么这段代码中调用了两次析构函数?

转载 作者:行者123 更新时间:2023-12-01 14:37:04 26 4
gpt4 key购买 nike

抱歉,但我不明白为什么调用了两次析构函数?

#include <iostream>
#include <thread>

class myClass
{
public:
int integer;
void operator()()
{
std::cout << "class: " << integer << "\t" << std::this_thread::get_id() << std::endl;
}
myClass(int h)
: integer{h}
{
}
~myClass()
{
std::cout << "MyClass by int: " << integer << " destroyed!" << std::endl;
}
};

bool myFunc(int x)
{
myClass tempClass(x);
std::thread one(tempClass);
one.join();
if (x <= 0)
return 0;
else
return myFunc(x - 1);
}
int main()
{
myFunc(10);
return 0;
}

注意:我只是在尝试多线程。 (训练)还有一个问题是,为什么在加入线程之前,我的类就被破坏了!

最佳答案

在行

std::thread one(tempClass);

创建了 tempClass 的拷贝。随后,myClass 的两个实例都被销毁。

您可以使用 std::ref 通过引用传递 tempClass,但是您必须保证 tempClass 保持有效(例如在线程的整个生命周期内(one),不会超出范围,由主线程进入无效状态。

您还可以将 tempClass 移动到另一个线程中。您仍然会得到两个析构函数调用,这对您的情况几乎不会产生任何影响,但如果 myClass 难以复制,它可能会产生影响。在这种情况下,您可能需要阅读移动语义。

关于c++ - 为什么这段代码中调用了两次析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63555899/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com