大量のデータを含むクラスの要素でSTLコンテナを処理する方法
-
23-10-2019 - |
質問
私は、ベクターやキューなどのSTLコンテナに、データ、サイズなどの基本機能を保持しているクラス内に保存されているクラス内に保存されています)を模索しています(プロデューサーがいるのでFIFOキューが最適です。そして消費者)。
問題は、コピーコンストラクターを実装しなければならないことです。 Destructorのデータ配列をいつ削除するかわからない問題(Destructorを2回呼び出し、データを1回しか持っていないため、Destructorへの最初の呼び出しは、コンテナ内の要素を挿入/移動することから発生する可能性が高いため、私はその時点でまだアレイデータが必要です)。
データ配列にSTD :: Shared_ptrのようなスマートポインターを使用することを考えましたが、読んだものからは、delete []を呼び出すのではなく、削除することはありません。これは、通常の配列[]があるので残念です。
現在、コンテナから削除する前にクラスで「Deletearray」関数を手で呼ぶ解決策があります。うまく機能しますが..それは良くありません。
何か案は?
解決
ブーストには shared_array
のようなクラス shared_ptr
しかし、使用します delete[]
, 、またはカスタムデレターを追加することもできます shared_ptr
それはそれを呼び出すでしょう delete[]
.
他のヒント
配列を使用しないでください std::vector
代わりは。次に、スマートポインターでそれを指します。
さらに良い解決策は、置くことです shared_ptr
容器に大きなオブジェクトにsを入れて、高価なコピーを一緒に避けます。
編集0:
もちろん、別のオプションは、オブジェクト自体を軽量でコピー可能にすることです shared_array
. 。エレミヤが示唆するように。
があります shared_ptr
少なくともブーストライブラリでは、アレイに相当します。それは呼ばれています shared_array
, 、そしてそれはあなたが期待するように正確に動作します。で仕様を確認してください http://www.boost.org/doc/libs/1_45_0/libs/smart_ptr/shared_array.htm?sess = 8940AD57BAA307D68CB2E7FD2939D2DB.
コピーコンストラクターに簡単な参照カウントを実装できます。削除するたびに参照を減らすことができます。
洞察に満ちた答えに感謝します!
これは、この問題が最後に自分自身をコピーせずにキューを手作りした理由を思い出させてくれます。素敵できれいなバージョンを行う方法を理解するよりもずっと時間がかかったとは言えません。 :)
だから..私がしたことは:
ソリューションa)元の投稿に記載されているように、ベクトルからクラスを削除する前に明示的に呼び出さなければならなかった関数を作成しました。良くありませんが、うまくいき、他のことを台無しにする必要はありませんでした。
ソリューションb)アレイをさらに別のクラスに配置し、そのクラスにSmartPointer(shared_ptr)を使用しました。本当にうまくいきました。ベクトルの要素としてShared_ptr Sを使用する必要がありました。 (最初は考えませんでした。)
ソリューションc)shared_ptrを使用して配列を保持します。結局のところ、削除の代わりにdeleteを呼び出すため、かなり悪い考え[]カスタム解像度を提供する必要があり、他の(構文)問題が現れたので、そのソリューションを行うには2H+のようなものが必要でした。
ヘッダーファイルではそのように見えます:
template< typename T >
struct
array_deleter
{
void
operator ()( T const * p)
{ delete[] p; }
};
class MemoryStressChunk
{
private:
int chunkSizeInValues;
std::shared_ptr< __int64 > data;
};
コードファイル:
data.reset(
new __int64[chunkSizeInValues],
array_deleter< __int64 >() );
そしてそれを使用するには、私はそれをもう一度出さなければなりません:
__int64 *d = data.get();
次回は、ブーストバージョンの使用を強く検討することができます。私は自分のマシンをブーストしていなかったので、それが私にとって選択肢ではなかった理由です。
解決策d)は、shared_ptr sを含むクラスのベクトルを(配列の代わりに)ベクターに使用することになります。すべての楽しみの後、私はc)私はそれを上にしませんでした。 :)
誰かがコードを見たい場合は、ここで入手できます http://andreas-reiff.de/wp-content/uploads/2011/01/tool-memtester.zip 。おそらくバージョンaにメムリークがあることに注意してください(バージョンbのようにクラスにshared_ptrを使用してください))。
もう一度あなたのすべての助けを求めて!