C ++指针分配不起作用(关闭34个字节)

时间:2016-01-03 16:28:37

标签: c++ pointers

在大型单线程C ++应用程序中(使用GCC 4.4.7 20120313编译),简单指针赋值不等于原始指针值:

class DvComVectorStreamBase : virtual public std::ios
{
    // some stuff here
};

class DvComVectorOStream : public DvComVectorStreamBase, public std::ostream
{
public:
    DvComVectorOStream(int which = std::ios::out, size_t capacity = 0) :
        DvComVectorStreamBase(which, capacity)
    {}
};


class Formatter : public aStandAloneClass
{
    // cruft removed

protected:
    void initFunction();

    ostream*                 mpStream;
    DvComVectorOStream*      mpVectorOStream;
}

Formatter:initFunction()
{
    printf("mpStream %p mpVectorOStream %p\n", (void *)mpStream, (void *)mpVectorOStream);
    if (mpVectorOStream == 0)
        mpVectorOStream = new DvComVectorOStream(ios::out, 32768);
    else
        mpVectorOStream->clear();

    printf("mpStream %p mpVectorOStream %p\n", (void *)mpStream, (void *)mpVectorOStream);
    mpStream = mpVectorOStream;
    printf("mpStream %p mpVectorOStream %p\n", (void *)mpStream, (void *)mpVectorOStream);
}

输出

mpStream (nil) mpVectorOStream (nil)
mpStream (nil) mpVectorOStream 0x90ccc98
mpStream 0x90ccccc mpVectorOStream 0x90ccc98

尝试在一个简单的测试用例中重现问题很好。

分配后,mpStream和mpVectorOStream不应该具有相同的值吗?

即。如果两个指针都指向同一个对象,那么每个指针应该包含相同的值,不是吗? (不是赋值运算符的全部意义吗?)

1 个答案:

答案 0 :(得分:5)

当一个类有多个基类时,只有第一个类与子类的地址相同,所以当你将子类指针转换为基类指针时,指针的值可能会改为指向基类子类实例中的实例。

类似地,当您将基类指针转换为子类指针时,该值可能需要更改为指向包含的子类

即使对于单继承,当派生类具有v表而基类不具有时,也会发生类似的调整。