c++ async:如果我不调用get(),std::shared_future内存分配会发生什么?

s6fujrry  于 2023-02-10  发布在  其他
关注(0)|答案(2)|浏览(264)

我正在做一个简单的想法,我遇到了这个问题。如果在一个异步调用之后,程序没有调用shared_future.get()就退出了,会发生什么?我会有内存泄漏吗?

//async function
std::shared_future<double*> sharedFutures = std::async(std::launch::async, myAsyncFunc, argument1, argument2);

if (   realtimeCondition )
{
    //what happens to sharedFutures memory allocation after exiting
    //memory leak?
    return 0;
}

//getting results
for (sharedFuture : sharedFutures )
   double* res = sharedFuture.get();
return 0;
pw9qyyiw

pw9qyyiw1#

shared_future在某种程度上模拟std::shared_ptr。它们都管理共享资源。当最后一个shared_x被销毁时,资源被释放。这在析构函数(cppreference:https://en.cppreference.com/w/cpp/thread/shared_future/%7Eshared_future):
共享的未来();(自C++11起)
如果*this是引用共享状态的最后一个对象,则销毁共享状态。否则不执行任何操作。
如果一个类管理一个资源,它应该在析构函数中释放它。这对所有的类都适用。这里的区别是同一个资源被潜在的许多对象共享。所以每个对象在销毁它之前必须检查它是否是最后一个拥有资源的。
因此,shared_future析构函数是在退出时调用的,而不是在通过get()?
如果一个对象在你调用它的一个方法时突然破坏了它自己,那就太糟糕了。特别是在这里,当你每次访问shared_futureshared_ptr管理的对象时,这个对象都会被破坏,shared_futureshared_ptr实际上都是无用的。当你的例子中的shared_future超出作用域时,它就会被破坏。

gv8xihay

gv8xihay2#

如果我没理解错你的问题的话,在future上调用get()会把future的state-〉retrieved改为true,但不会调用destruction,任何类型的future的destruction都不依赖于它自己的状态。

相关问题