gpt4 book ai didi

C++ 指针分配不起作用(减少 34 字节)

转载 作者:太空宇宙 更新时间:2023-11-04 16:06:24 25 4
gpt4 key购买 nike

在大型单线程 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 赋值后不应该有相同的值吗?

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

最佳答案

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

同样,当你将基类指针转换为子类指针时,值可能需要更改为指向包含的子类

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

关于C++ 指针分配不起作用(减少 34 字节),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34578804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com