带有继承的new使用不当

Improper usage of new with inheritance?

本文关键字:new 使用不当 继承      更新时间:2023-10-16

我正在试图找出一个崩溃,并将其归结为以下示例:

class Base
{
public:
    virtual unsigned int    GetNum  () = 0;
};
class Derived : public Base
{
    int data;   // <--- commmenting this out removes the crash
public:
    Derived() {}
    virtual unsigned int    GetNum() { return 1; }
};
void func() {
    Base** ppBases;
    unsigned int xLen = 3;
    unsigned int yLen = 4;
    ppBases = new Base*[xLen];
    for(unsigned int x = 0; x < xLen; ++x) {
        ppBases[x] = new Derived[yLen];
        for(unsigned int y = 0; y < yLen; ++y) {
            Base* curBase = dynamic_cast<Base*>(&(ppBases[x][y]));
            Derived* curDerived = dynamic_cast<Derived*>(&(ppBases[x][y])); // <--- crashes with a null dereference
            unsigned int result = curBase->GetNum();
            result = result;
        }
    }
}

我猜想Derived实际上并没有被分配适当的大小。将ppBases更改为三元组指针(像这样)可以使一切正常工作:

void func() {
    Base*** ppBases;
    unsigned int xLen = 3;
    unsigned int yLen = 4;
    ppBases = new Base**[xLen];
    for(unsigned int x = 0; x < xLen; ++x) {
        ppBases[x] = new Base*[yLen];
        for(unsigned int y = 0; y < yLen; ++y) {
            ppBases[x][y] = new Derived();
            Base* curBase = dynamic_cast<Base*>(ppBases[x][y]);
            Derived* curDerived = dynamic_cast<Derived*>(ppBases[x][y]);
            unsigned int result = curBase->GetNum();
            result = result;
        }
    }
}

我不明白为什么。

感谢

问题出在这行:

 ppBases[x] = new Derived[yLen];

您正在将Derived对象的数组分配给Base *指针。因此,当您编写ppBases[x][y]时,编译器会使用指针的类型Base *,并适当地进行索引。因此,ppBases[x][1]不引用所分配的数组中的第二个Derived对象。