1.1) std::vector、QVector、boost::array を使用するときにメモリ リークの可能性はありますか (メモリの使用におけるそれらの違いとそれぞれの利点はよくわかりません)。それとも、スマート ポインターとしてメモリをたどりますか?
1.2) それとも、shared_ptr を介してそれらを作成する方が良いですか?
2) shared_aray または shared_ptr + vector のどちらが優れていますか?
1.1) std::vector、QVector、boost::array を使用するときにメモリ リークの可能性はありますか (メモリの使用におけるそれらの違いとそれぞれの利点はよくわかりません)。それとも、スマート ポインターとしてメモリをたどりますか?
1.2) それとも、shared_ptr を介してそれらを作成する方が良いですか?
2) shared_aray または shared_ptr + vector のどちらが優れていますか?
それらが管理するメモリでは、これら 3 つのいずれにもメモリ リークの可能性はありません。つまり、std::vector
、QVector
またはに格納されているデータはstd::array
、コンテナが破棄されると正しく割り当て解除されます。
一方で、コンテナ自体を安全でない方法で管理すると、当然、コンテナ全体をリークする可能性があります。たとえば、次のようなことをしてnew std::vector<int>()
、後でnew
与えたポインターをリークした場合。コンテナーを動的に割り当てる理由はほとんどないことに注意してください。
また、コンテナーに安全でないポインターを格納すると、もちろん、そのようなポインターが指すものをリークする可能性があります。
あなたがリストしたコンテナの違いについては:
std::vector
メモリの連続した配列を保持し、より多くのスペースが必要なときに動的に拡張できます。このような拡張ごとに、より大きなスペースを割り当て、現在格納されている要素を新しいスペースに移動してから、古いスペースの割り当てを解除する必要があります。
QVector
に少し似た奇妙な獣std::deque
です。内部的には、ポインタのベクトルであるかのように実装されています。QVector<T>
つまり、と同等std::vector<std::unique_ptr<T>>
、T
ポインタよりも大きい、ポインタサイズ以下std::vector<T>
と考えると、それほど離れていませんT
。
std::array
動的メモリを保持せず、動的に拡張できないという点で、上記の 2 つとは根本的に異なります。std::array<T, N>
は、 の非常に薄いラッパーT [N]
であり、コンテナのようなインターフェイスを提供します。
あなたの質問 2 に関しては、それぞれが再び異なります。shared_array
一度割り当てられると、a は成長できませんstd::vector
。そもそも動的に割り当てることはめったにないためstd::vector
、スマートポインター (または任意のポインター) に格納する理由はほとんどありません。