我正在动态创建线程:
auto thr =new std::future<void>(std::async(/*some callable*/));
我将所有这些指针存储在std::vector<future<void>*>
中。为了释放内存,我正在做:
for(int i(0);i<futureVector.size();i++)
{
if(futureVector.at(i)->valid())
{
futureVector.at(i)->get(); // for getting exception,if any
}
delete futureVector.at(i); // the problem is here
}
现在在我的代码中,可能会发生为futureVector.at(i)
分配的内存已经被释放(可能在某些其他线程中,可能由某些其他函数)。
我的问题是如何检测futureVector.at(i)
指针是否有效?我是否指出有效的std::future
?
注意:futureVector
变量是我班级的静态成员。
假如我不删除future
对象的成本非常大(已检索到的未来)
答案 0 :(得分:7)
如果由于某种原因你实际上需要指针,则不应在向量中使用拥有原始指针。
auto thr = std::make_unique<std::future<void>>(std::async(/*some callable*/)); // C++14
std::unique_ptr<std::future<void>> thr {new auto {std::async(/*some callable*/)}; // C++11
但实际上你根本不需要指针。仅仅因为你不知道你将创建多少线程并不意味着你需要使用指针。
std::vector<std::future<void>> futureVector;
futureVector.emplace_back(std::async(/*some callable*/));
无论哪种方式,您都不需要手动循环并删除任何内容。
(也许在其他一些帖子中,可能还有其他一些功能)
如果您仍然使用原始指针,那么您确实需要更好地定义所有权政策。允许一些随机的其他代码删除它不拥有的资源不是一个好主意。