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
}

这段代码泄漏了两个对象——一个类型B(发生在pToA = pToC语句中)和一个类型C(发生在main返回时)。在这种情况下,“参考”实际上并没有在这里发挥多大作用。在 C++ 中,引用只是其他对象的别名。您不能“重新安装”它们。也就是说,一旦引用引用了某些东西,它就再也不能引用其他任何东西了。

在本例中,当您创建 pToA 时,您创建了对指针的引用——本例中的指针为pToDerived. 进行此引用对内存管理或某些代码delete在正确位置调用的责任没有影响。

于 2012-12-13T07:16:23.860 回答