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

时间:2012-04-18 14:02:28

标签: c++ visual-c++ pointers destructor stdvector

下面的代码来自我用动态内存管理编写的游戏。我有一个名为'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。

1 个答案:

答案 0 :(得分:2)

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

通常情况下,链接列表的地点较差。但是使用指针向量,虽然指针本身可能存储在很大的位置,但内容需要额外的间接级别,并且会丢失局部性。

使用侵入式链接列表,该位置与内容的位置完全一样好。因此,您可以获得地方的理论上限,以及便宜的插入和移除。


您的实际问题可能源于不对每个构造函数进行插入。默认情况下,编译器会生成一个复制构造函数(在C ++ 11中,移动构造函数),除非您提供自己的all_gadgets列表,否则不会更新{{1}}列表。