【发布时间】:2016-06-07 07:28:06
【问题描述】:
unique_ptr 是否按预期正确使用?代码以一些内存泄漏结束(可能是误报?或真正的泄漏?)。我认为将所有权转移到 RunSimulation 中,unique_ptr 的生命将结束,并且将在循环中创建更新的生命周期,然而,这以访问冲突结束。
理想情况下,我希望 main() 中的一个 unique_ptr 对象在 main() 中过期,而另一个发送到 main 外部以在 RunSimulation() 中释放。
class Result { public: int n; };
void RunSimulation(std::unique_ptr<Result> result) {result->n = 0;}
void main()
{
boost::thread_group threads;
std::unique_ptr<Result> r;
std::unique_ptr<Simulation> sim = std::make_unique<Simulation>();
for (int i = 0; i < 10; i++)
{
r = std::unique_ptr<Result>(new Result);
//Erroneous lines:
//threads.create_thread(boost::bind(&RunSimulation, std::move(r)));
//threads.create_thread([&] {RunSimulation(std::move(r)); });
}
threads.join_all();
}
【问题讨论】:
-
RunSimulation接受一个指针,但从不在任何地方分配它......那个函数的目的是什么?此外,如果它会分配指针,std::unique_ptr 的get只会获取指针,这意味着指针将在作用域的末尾被删除。您可能希望使用函数release将指针的所有权传递给类RunSimulation。 (仍然完全什么都不做......) -
get不会移动所有权——r仍然拥有该对象,并且在分配给该对象时将销毁该对象。而引用捕获意味着RunSimulation的指针将指向r在线程运行时拥有的对象,这可能要晚很多。 (我也怀疑赋值和get是线程安全的。) -
顺便说一下,关于
_CrtDumpMemoryLeaks();的使用。您可能需要检查atexit并将对内存泄漏的调用放在void xxx(void)函数内,或者确保在所有销毁完成后调用位于最外层范围内。 -
谢谢@Blacktempel。例子是支持link。
-
通过使用释放,我必须明确释放指针。有没有办法将 unique_ptr 传递给 RunSimulation 作为 unique_ptr 本身,它可以结束它的生命?使用 std::move 会导致运行时崩溃。
标签: c++ multithreading for-loop memory-leaks unique-ptr