下面的代码来 self 用动态内存管理编写的游戏。我有一个名为“all_gadgets”的静态 vector ,其中包含指向游戏中每个小工具的指针。 在运行时删除小工具时,我想从静态 vector 中删除相应的指针。我试过这个:
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。
最佳答案
为此使用侵入式双链表,插入、删除和有序迭代会更高效。
通常,链表的局部性较差。但是对于指针 vector ,虽然指针本身可能存储在很大的局部性中,但内容需要额外的间接级别和局部性损失。
有了侵入式链表,局部性就和内容的局部性一样好。因此,您达到了局部性的理论上限,加上廉价的插入和移除。
您的实际问题可能是由于没有为每个构造函数都进行插入而引起的。编译器默认生成复制构造函数(在 C++11 中为移动构造函数),它不会更新您的 all_gadgets
列表,除非您提供自己的列表。
关于c++ - 在元素自身的析构函数中删除指向静态 vector 中元素的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10211036/