微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用虚拟析构函数c ++删除指向基类的指针*&

如何解决使用虚拟析构函数c ++删除指向基类的指针*&

因此,我有一个运行在非常旧的系统(2006-2007)上的游戏服务器,该系统在玩家登录时创建玩家对象,在创建怪物时创建怪物对象,在出现npc时创建npc对象。所有这些类都是从生物类派生的,并且它们都具有虚拟析构函数。因此,当我创建这些对象时,会将它们添加到操作符()重载的生物矢量(不是实际的STL矢量,而是定制模板)中。我编写了这个虚拟代码以便于显示

vector<Creature *> CreatureList(100);

template <typename T>
struct vector {
    vector(int InitialSize);
    int InitialSize;
    T& operator()(int i);
    T* Entry; // At constructor,this is 'Entry = new T[InitialSize];' and is deleted at destructor.
};

struct Creature {
    Creature();
    virtual ~Creature();
    bool IsOnMap;
    char Name[30];
};

struct Player : Creature {
    Player();
    virtual ~Player();
    int PlayerState;
    int PlayerID;
};

struct Monster : Creature {
    Monster();
    virtual ~Monster();
    int SpawnPosX,SpawnPosY;
    int Health;
};

struct NPC : Creature {
    NPC();
    virtual ~NPC();
    Object TradeChest;
    int SpawnPosX,SpawnPosY;
};

int OnPlayerLogin() {
    Player *pl = new Player;
    CreatureList(NextCreatureID++) = pl;
    return PlayerID;
}

void OnMonsterSpawn() {
    Monster *mn = new Monster;
    CreatureList(NextCreatureID++) = mn;
}

void OnNPCSpawn() {
    NPC *npc = new NPC;
    CreatureList(NextCreatureID++) = npc;
}

void ProcessAllCreatures() {
    for (int i = 0; i < NextCreatureID; i++) {
        Creature* cr = CrList(i); // this doesn't return Creature* but actually Creature*&
        if (!cr)
            continue;

        if (!cr->IsOnMap)
            delete cr; // This spits a SIGSEGV (Segmentation fault).
    }
}

此伪代码假定所有初始化都在构造函数中完成。 NextCreatureID只是作为索引的自动增量变量。自定义矢量类只是一个自动调整大小的数组,operator()始终将引用返回到实际对象(由于内部代码约定而不能更改)。

问题在于它将SIGSEGV发送到该进程,并且如果我尝试delete &cr,由于指针无效,我会得到SIGABRT。因此,有什么方法可以解决此问题而不必更改向量类吗? (由于我所说的协作,对我来说这是不可能的。)

解决方法

if (!cr)
    continue;

将无法正常工作。 delete指向指针不会将其重置为nullptr。在您第一次调用ProcessAllCreatures()时,一切都可能正常工作,第二次调用时,您将删除已删除的指针,因为在查看已删除的指针时永远不会continue

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。