4

たとえば、私は自分で書き込もうとしているので、このように関数をvector書きます。assign

template <typename T>
void Vector<T> :: assign(T *start, T *end)
{
    if (end - start > _capacity)
    {
        resize(end - start);
    }
    _size = end - start;
    delete []ptr;
    ptr = new T[_capacity];
    memcpy(ptr, start, end - start);
}

以前に新しいポインタを持っていますが、ポインタとptrポインタの間のすべてをコピーできますstartend

なぜ?どうもありがとうございます。

4

2 に答える 2

4

最初の問題は、これが単純なタイプ(PODを読み取る)でのみ機能することです。
コンストラクタ/デストラクタを使用するものはすべて、それらを呼び出す必要があります。

第二に、これは例外安全ではありません。
それは基本的な保証さえ提供しません。

オブジェクトを変更する前に、すべての例外の安全でない作業を行う必要があります。これは、オブジェクトを変更する前に(そして、間違いなくフリーの前に)実行する必要があることを意味ますnew。そうしないと、オブジェクトを無効な状態のままにしてスローする可能性があります(これは悪くないように見えるかもしれませんが、例外をキャッチして続行すると、解放されたメモリへのポインタを含むオブジェクトができます)。

ですから、あなたが使ったとしても、あなたはstd::copy()まだ間違ったことをしているのです。
個人的には、std :: copy()の提案は赤いニシンだと思います。それはデータを正しくコピーしますが、あなたはまだあなたのメソッドをひどく書いています。コピーとスワップのイディウムにひねりを加える必要があります。

template <typename T>
void Vector<T> :: assign(T *start, T *end)
{
    Vector<T> tmp(start, end);  // construct a temp object that allocates the memory.



    swap(tmp);                  // Swap the current object and the tmp objects data.
                                // When the tmp object goes out of scope it will delete
                                // what was the current objects data

}
于 2012-06-08T16:55:44.237 に答える
3

この方法でポインタを再利用することはまったく問題ありませんが、タイプTがわからないため、ここでmemcpyを使用するのは安全ではありません。Tが文字列やベクトルなどのオブジェクトタイプの場合、これにより未定義の動作が発生します。

これを修正するには、行を次のように変更します

std::copy(start, end, ptr);

これは、これを行うための安全なC++の方法です。

お役に立てれば!

于 2012-06-08T16:45:50.300 に答える