0

次のコードを確認してください。

class A { public: virtual void Foo() = 0; int Bar; };

class B : public A { public: B( float X ); void Foo(); private: float X; };

class C : public A { public: C( float Y ); void Foo(); private: float Y; };

さて、いくつかの関数で私がこれをしたとしましょう:

A*& pToA = pToDerived; // allocated as A* pToDerived = new B( ... );

pToA     = pToC; // allocated as A* pToC = new C( ... );

これは有効ですか?pToAもしそうなら、それはのポインタへの参照であるにもかかわらず、メモリリークを引き起こしpToDerivedますか?

SSCS

Nodeたとえば、それから派生した2つ以上のタイプがあると仮定します。これは、現在実装しているリンクリストのスニペットです。一般的なものではないため、正しく機能するにはポリモーフィズムが必要になる可能性があります。newnode挿入関数に渡される引数です。

    Node* iNode;

    for( iNode = mStart; iNode != mEnd; iNode = iNode->Next )
    {
        if ( iNode->Key == k ) // Replace current node with newnode
        {
            newnode->Next = iNode->Next;
            newnode->Prev = iNode->Prev;

            *iNode        = *newnode;

            delete newnode;

            return;         // We're done, so we quit.
        }
    }   

    // Node doesn't alreay exist, so we add it.

    Node*& uglyhack = mEnd;

    iNode->Next   = newnode;
    newnode->Prev = iNode;
    uglyhack      = newnode;
4

2 に答える 2

3

これはするのと同じです

pToDerived = pToC;

それには本質的に何も悪いことはありません。通常のように、オブジェクトを削除しない場合にのみメモリリークが発生します。

更新されたコードでは、次のことを実行できます。

iNode->Next   = newnode;
newnode->Prev = iNode;
mEnd          = newnode;

そしてそれは同じだろう。

于 2012-12-13T07:07:11.947 に答える
2

あなたが次のものを持っているとしましょう:

// See http://codepad.org/8mG6YiLy
class A { public: virtual void Foo() = 0; int Bar; };

// Added definitions for these so that this would compile
class B : public A {
    public: B( float x ) : X(x) {}
    virtual void Foo() {} // Once virtual, always virtual
    private: float X;
};

class C : public A {
    public: C( float y ) : Y(y) {}
    virtual void Foo() {}
    private: float Y;
};

int main()
{
    A* pToDerived = new B(3.14);
    // pToDerived -> B

    A*& pToA = pToDerived;
    // pToDerived -> B
    // pToA IS pToDerived

    A* pToC = new C(2.718);
    // pToDerived -> B
    // pToC -> C
    // pToA IS pToDerived

    pToA = pToC;
    // pToDerived -> C
    // pToC -> C
    // pToA IS pToDerived
    // One object of type B no longer has pointers pointing to it
}

このコードは、2つのオブジェクトをリークします。1つはタイプBpToA = pToCステートメントで発生)、もう1つはタイプ(リターンC時に発生)です。mainこの場合の「参照」は、実際にはここではあまり重要ではありません。C ++では、参照は他のオブジェクトの単なるエイリアスです。それらを「再装着」することはできません。つまり、参照が何かを参照すると、それ以外のものを参照することはできなくなります。

この場合、pToAを作成したときに、ポインターへの参照を作成しました。この場合のポインターはpToDerivedです。この参照を作成しても、メモリ管理やdelete、適切な場所で呼び出すコードの責任には影響しません。

于 2012-12-13T07:16:23.860 に答える