在元素自己的析构函数中擦除指向静态向量中元素的指针

erasing a pointer to an element in a static vector, in the element's own destructor

本文关键字:元素 向量 静态 指针 擦除 自己的 析构函数      更新时间:2023-10-16

下面的代码来自我用动态内存管理编写的游戏。我有一个名为"all_gadgets"的静态向量,其中包含指向游戏中每个小工具的指针。在运行时删除小工具时,我想从静态向量中删除相应的指针。我试过这个:

Gadget::~Gadget(){
    int i = Gadget::all_gadgets.size();
    for (std::vector<Gadget *>::iterator it = Gadget::all_gadgets.begin(); it!=all_gadgets.end(); ++it){
        if ((*it)==this){
            Gadget::all_gadgets.erase(it);
            break;
        }
    }

    int j = (i - Gadget::all_gadgets.size());
    if(j!=1)
        std::cout << j << " ooops! Gadget not deleted!!" << std::endl;
}

在上面的代码中,j 将变为零:(有什么建议吗?

将指针设置为 null 不是一个选项。我正在使用VC10。

为此使用侵入性双链表,它将更有效地进行插入、删除和按顺序迭代。

通常,链表的局部性很差。 但是,对于指针向量,虽然指针本身可能以很大的局部性存储,但内容需要额外的间接级别和局部性的损失。

使用侵入性链表,位置与内容的位置完全相同。 因此,您可以实现局部性的理论上限,加上廉价的插入和移除。


您的实际问题可能是由于没有为每个构造函数执行插入而引起的。 默认情况下,编译器会生成一个复制构造函数(在 C++11 中,移动构造函数),除非您提供自己的构造函数,否则不会更新您的all_gadgets列表。