0

valgrindに基づくと、新しいセットを別のセットに割り当てた後にエラーが発生するため、エラーはこれらの人に起因すると思います。Set Z-> A ^ B(Setを返す交差演算)。何を間違えたのかよくわかりません。助けていただければ幸いです。

Set::~Set()
{
        Cap = 0;
        Num = 0;
        delete [] Pool;
        Pool = NULL;
}
Set::Set(const Set &A)
{
        Cap = A.capacity();
        Num = A.size();
        Pool = A.Pool;
}
Set& Set::operator=(const Set &X)
{
        Cap = X.capacity();
        Num = X.size();
        Pool = X.Pool;
        return *this;
}
4

3 に答える 3

2

動的に割り当てられた配列Poolがあります。これは、コピーコンストラクターと代入演算子で浅くコピーしています。したがって、同じ配列を削除しようとする複数のオブジェクトがあります。

の「ディープコピー」を作成する必要がありますPool。つまり、元の要素のコピーを含む動的に割り当てられた新しい配列を作成する必要があります。このためには、元の配列のサイズを知る必要があります。最も簡単な解決策は、std::vector代わりに使用することです。そうすれば、独自のコピーコンストラクタと代入演算子を提供する必要さえありません。コンパイラで合成されたもので十分です。

于 2012-11-01T17:30:55.920 に答える
0

浅いコピーを実行しているため、コピーに含まれるソースオブジェクトと宛先オブジェクトの両方が単一のメモリブロックへの同じ参照を共有します。当然、2つのオブジェクトが破棄されると、最初のオブジェクトはdelete[]このメモリブロックになり、2番目のオブジェクトは同じことを実行して「ダブルフリー」になります。

Poolコピーの宛先に新しいものを割り当ててから使用memcpy(または同様)してコンテンツを複製するか、既存のコンテナ(たとえば、std::vector<>)を使用してプールのコンテンツを格納し、標準ライブラリのコピー実装に依存することができます。浅いコピーが本当に必要なものであり、Pool両方のインスタンスで同じものが共有されている場合は、メモリプールへのある種の共有ハンドルを使用できます(配列をラップするためにを使用するこの例を参照してください)。std::shared_ptr

于 2012-11-01T17:36:53.703 に答える
0

だから君たちは大丈夫だった。しかし、ここで私と同じ問題を抱えている人にとっては、それを解決するために私がしたことです。

Pool = new int[A.capacity()];
*Pool = *A.Pool;
Num = A.size();
Cap = A.capacity();
于 2012-11-01T19:40:28.797 に答える