1

私は動的にスレッドを作成しています:

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と、コストが非常に大きくなります(すでに取得された未来)

4

1 に答える 1

9

なんらかの理由で実際にポインターが必要な場合は、ベクター内で生のポインターを所有することを使用しないでください。

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*/));

いずれにせよ、手動でループして何かを削除する必要はありません。

(おそらく他のスレッドで、他の関数である可能性があります)

それでも生のポインターを使用する場合は、所有権ポリシーをそれよりも適切に定義する必要があります。所有していないリソースを削除するランダムな他のコードを許可することは、良い考えではありません。

于 2013-09-12T14:56:59.767 に答える