3

参照カウントポインタ<Type>クラスのインスタンスを配列クラスに配置する際に問題が発生しました。デバッガーを使用すると、コンストラクターが呼び出されることはないようです(これにより、参照カウントが台無しになり、セグメンテーション違反が発生します)。

私のpush_back関数は次のとおりです。

void push_back(const T& element)
{
    if (length >= max)
        reallocate(max > 0 ? max * 2 : 1);

    new (&data[length]) T(element);
    ++length;
}

newが呼び出される前の参照カウントはafterと同じです。これが問題であると確信していますが、コンストラクターが呼び出されない理由がわかりません。さらに、Pointer :: Pointer(...)は、Pointer <T>&またはconst Pointer&のどちらを使用するかをコンパイルします<T>(え?)、それでも問題があります!

たぶん、私が考慮していない新しい配置に関するいくつかの詳細があります。誰かが何か考えを持っているなら、彼らは大いに感謝されるでしょう!

編集:[要求に応じて、ポインターからの関連する抜粋]

// ...
private:
    T* p;

public:
    //! Constructor
    Pointer()
        : p(0)
    {

    }

    //! Copy Constructor
    template<class X> Pointer(Pointer<X>& other)
        : p(other.getPointer())
    {
        if (p)
            p->incrementRef();
    }

    //! Constructor (sets and increments p)
    Pointer(T* p)
        : p(p)
    {
        if (p)
            p->incrementRef();
    }

    //! Destructor (decrements p)
    ~Pointer()
    {
        if (p)
            p->decrementRef();
    }
// ...

ポインター<T>&と、、およびT*演算子->と演算子の演算子=も実装しましたT*

4

3 に答える 3

2

ドキュメントによると、コンストラクターを呼び出す必要があります...確認できることはほとんどありません。

ポインタをテストするには:

Pointer<int> p1(new int);
Pointer<int> p2(p1); // Does this call constructor properly?

アレイをテストするには:

Array<std::string> array;
std::string str("bla");
array.push_back(str); // Does this call string's constructor

それが失敗するのですよね?

Array<Pointer<int> > array;
Pointer<int> p1(new int);
array.push_back(p1);

他のすべてが失敗した場合は、いつでもこれを実行して、コピーコンストラクターまたはoperator=を確実に呼び出すことができます。

T* t = new (&data[length]) T();
*t = element;
于 2009-07-23T05:48:55.267 に答える
2

コメントとコードが同期していません:

//! Copy Constructor
template<class X> Pointer(Pointer<X>& other)

クラステンプレートから生成されたコンストラクターはコピーコンストラクターではないため(12.8 [class.copy]にこれを明確にする脚注があります)、コンパイラーがコピーコンストラクターを生成するのを妨げることはありません。オーバーロード解決では、テンプレート関数よりも非テンプレート関数の方が優先されるため、この生成されたコンストラクターは、標準のコピーにより適しています。

目的の効果を得るには、ポインタクラスに明示的なコピーコンストラクタを記述する必要があるようです。

于 2009-07-23T06:37:38.507 に答える
0

ここにポインタークラスを投稿してください。このクラスのTはポインタだと思いますか?もしそうなら、コードは次のようになります。new(&data [length])Pointer(element);

理解するのに苦労しています。

なぜそうしないのですか:data [length] = element; data[length]はポインターだと思います

于 2009-07-23T06:08:56.707 に答える