for (int i = 0; i < 10; i++) {
thread *t = new thread(example_function);
t->join();
}
我在我的编码项目中做了类似的事情,并且想知道如果线程在循环内被定义,它们在循环结束后被销毁(我知道线程的指针可能会被删除但是线程本身呢? ?)。
答案 0 :(得分:4)
不,join()
循环内创建的thread
个对象不会被破坏,这意味着它们会造成内存泄漏。
为了确保线程被破坏,您需要通过以下几种方式之一调用for
:
delete
或delete
,或请注意,由于您在每次循环迭代时调用delete
,因此“并发”程序与单线程程序一样好。以下是如何同时运行线程,并确保最后的线程删除:
join
一旦std::vector<std::unique_ptr<std::thread>>> threads;
for (int i = 0; i < 10; i++) {
threads.push_back(std::make_unique<thread>(example_function));
}
for (int i = 0; i < 10; i++) {
threads[i]->join();
}
向量超出范围,它就会删除其中的threads
个对象,而这些对象又会在单个std::unique_ptr<thread>
个对象上调用delete
。
答案 1 :(得分:2)
我在我的编码项目中做了类似的事情,并且想知道如果线程在循环内被定义,它们会在循环结束后被销毁
使用运算符new
进行动态分配的全部目的是提供对对象生存期的手动控制。所以不,直到你明确地调用delete
或者你使用一个智能指针为你做引导你的对象不会被破坏。注意,在循环内部有效调用std::thread::join()
会使程序单线程化。更合适的用途是:
std::vector<std::thread> threads;
while( threads.size() < 10 )
threads.emplace_back(example_function);
for( auto &thread : threads )
thread.join(); // join in a separate loop, let all threads to start
threads.clear(); // or let it go out of scope
答案 2 :(得分:0)
这里
username:john & password: 123456
你已经松开了之前分配的thread *t = new thread(example_function);
实例并且有内存泄漏。
thread
不释放已分配的内存,但会选择异步终止的函数。
答案 3 :(得分:0)
没有。调用者负责确保使用new
分配的对象为delete
d。
代码当然是毫无意义的,因为没有有意义的并发发生但是为了避免内存泄漏应该是:
for (int i = 0; i < 10; i++) {
thread *t = new thread(example_function);
t->join();
delete t;
}
在任何版本的C ++ 11之后,建议您在这些情况下使用std::unique_ptr
:
最推荐的形式是:
auto t{std::make_unique<std::thread>(example_function)};
这几乎相当于:
std::unique_ptr<std::thread> t(new std::thread(example_function));
std::unique_ptr
是一个操作符重载的对象,其行为与指针很相似,不同之处在于它在生命周期结束时删除它所指向的东西(如果有的话)。