2012-04-18 73 views
0

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

+0

实际调用了'erase'吗? – 2012-04-18 14:07:34

+0

如何把cout放在if里面?这样你可以确认它是否真的到达里面。另外,你确定这个小工具是否在all_gadgets列表中?你有没有尝试打印all_gadgets.size()? – Agentlien 2012-04-18 14:14:59

+0

多个线程可以访问'vector'吗? 'j'的价值是什么? – hmjd 2012-04-18 14:16:15

回答

2

使用有创双链表这一点,这将是插入,删除更高效,有序的迭代。

通常情况下,链表从局域性较差苦。但随着你的载体的指针,而指针本身m可以存储在很好的地方,内容需要额外的间接水平和局部性的损失。

通过侵入式链接列表,地点与内容的地点完全一样好。因此,您可以实现地理位置的理论上限,以及便宜的插入和移除。


您的实际问题可能源于没有做插入的每一个构造函数。编译器默认生成一个拷贝构造函数(在C++ 11中,移动构造函数),除非你自己提供,否则它不会更新你的all_gadgets列表。

+0

事情是,prog确实进入了if语句。 – Nolf 2012-04-18 15:37:52

+0

@Nolf:它是否在'j'出现零的同一对象上输入if语句?或者某些对象已成功删除,有些则不成功(取决于所使用的构造函数)? – 2012-04-18 15:40:23

+0

它在同一个对象上,所有对象的问题都是一样的。我敢肯定,问题不在于构造函数,因为我使用相同的矢量从文件加载/保存,然后所有对象都成功保存。 – Nolf 2012-04-18 15:43:54