任意の数の動的に作成された (さまざまなタイプの) インスタンスを STL コンテナーに格納して、後でコンテナーのみを使用してメモリを解放できるようにするにはどうすればよいでしょうか?
次のように動作するはずです。
std::vector< void * > vec;
vec.push_back( new int(10) );
vec.push_back( new float(1.) );
現在、vec
スコープ外になると、インスタンスへのポインターは破棄されますが、 と のメモリは解放されませんint
。float
そして明らかに私はできません:
for( auto i : vec )
delete *i;
void*
オブジェクトへのポインタ型ではないためです。
ベクトルの要素にアクセスできないため、これは良い考えではないと反対し、主張することができます。そうです、私はそれらにアクセスしません。NVIDIA ドライバーはvoid*
、カーネル呼び出しのパラメーターに必要なアドレス (問題ありません) だけであるため、それらにアクセスします。
ここでの問題は、さまざまなタイプが格納される可能性があることだと思います。これを引数としてcudaunion
カーネルに渡したい場合に備えて、トリックを実行できるかどうか疑問に思っています。
カーネルはさまざまな型のパラメーターを受け取り、事前に型がわからない式ツリー (式テンプレート) を走査することによって収集されます。したがって、リーフにアクセスすると、パラメーターが保存されます。void* および組み込み型 int、float などのみを指定できます。
ベクトルは、カーネルの起動直後に削除できます (起動は非同期ですが、ドライバーは最初にパラメーターをコピーしてからホスト スレッドを続行します)。2 番目の質問: 各引数は void* としてドライバーに渡されます。int、float、または void* であるかどうかに関係なく。したがって、必要以上のメモリを割り当てることができると思います。組合のことは一見の価値があると思います。