gpt4 book ai didi

c++ - 为什么这段代码会在提到的地方崩溃?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:48:24 24 4
gpt4 key购买 nike

您能否详细说明为什么这段代码会在提到的地方崩溃?我对此有点困惑。我猜它与 sizeof(int) 有关,但我不太确定。谁能解释一下?

class Base
{
public:
virtual void SomeFunction()
{
printf("test base\n");
}

int m_j;
};

class Derived : public Base {
public:
void SomeFunction()
{
printf("test derive\n");
}

private:
int m_i;
};

void MyWonderfulCode(Base baseArray[])
{
baseArray[0].SomeFunction(); //Works fine
baseArray[1].SomeFunction(); //Crashes because of invalid vfptr
baseArray[2].SomeFunction(); //Crashes because of invalid vfptr
baseArray[3].SomeFunction(); //Works fine
baseArray[4].SomeFunction(); //Crashes because of invalid vfptr
baseArray[5].SomeFunction(); //Crashes because of invalid vfptr
baseArray[6].SomeFunction(); //Works fine
baseArray[7].SomeFunction(); //Crashes because of invalid vfptr
baseArray[8].SomeFunction(); //Crashes because of invalid vfptr
baseArray[9].SomeFunction(); //Works fine
}
int _tmain(int argc, TCHAR* argv[])
{
Derived derivedArray[10];
MyWonderfulCode(derivedArray);
return 0;
}

最佳答案

sizeof(Derived) 大于 sizeof(Base)。这就是原因。

通常,索引 i 处的 Foo 对象数组的索引工作方式如下:

element_address = array_base_address + i * sizeof(Foo)

如果数组元素不是预期的大小,您可以看到此索引如何中断。为什么它适用于某些索引是因为有时计算的元素地址指向内存中的有效对象(但它实际上不是第 i 个对象)。

关于c++ - 为什么这段代码会在提到的地方崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1043402/

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