C++ 擦除静态向量中元素';自毁函数
下面的代码来自我用动态内存管理编写的一个游戏。我有一个名为“所有小工具”的静态向量,其中包含指向游戏中每个小工具的指针。 在运行时删除小工具时,我想从静态向量中删除相应的指针。我试过这个:C++ 擦除静态向量中元素';自毁函数,c++,visual-c++,pointers,destructor,stdvector,C++,Visual C++,Pointers,Destructor,Stdvector,下面的代码来自我用动态内存管理编写的一个游戏。我有一个名为“所有小工具”的静态向量,其中包含指向游戏中每个小工具的指针。 在运行时删除小工具时,我想从静态向量中删除相应的指针。我试过这个: Gadget::~Gadget(){ int i = Gadget::all_gadgets.size(); for (std::vector<Gadget *>::iterator it = Gadget::all_gadgets.begin(); it!=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;
}
Gadget::~Gadget(){
int i=Gadget::all_gadgets.size();
for(std::vector::iterator it=Gadget::all_gadgets.begin();it!=all_gadgets.end();+it){
如果((*it)=这个){
小工具:所有小工具。擦除(它);
打破
}
}
intj=(i-Gadget::all_gadgets.size());
如果(j!=1)
std::cout为此使用侵入性的双链表,它将更有效地进行插入、删除和按顺序迭代
通常情况下,链表的局部性较差。但是对于指针向量,虽然指针本身可能以较大的局部性存储,但内容需要额外的间接性和局部性损失
使用侵入式链表时,局部性与内容的局部性一样好,因此可以实现局部性的理论上限,再加上廉价的插入和删除
您的实际问题可能是因为没有为每个构造函数进行插入。编译器生成一个副本构造函数(在C++11中,是move构造函数)默认情况下,它不会更新您的所有小工具列表,除非您提供自己的列表。在if中放置一个cout如何?这样您可以确认它是否实际到达内部。此外,您确定此小工具确实在所有小工具列表中吗?您是否尝试打印所有小工具。size()?多个线程是否可以访问向量
?j
的值是多少?并在您将小工具插入向量的位置添加一个cout
。可能失败了。@hmjd:问题清楚地说“j
将变成零”。我使用向量保存和加载文件。只要不删除任何内容,它就可以正常工作:指针插入向量中,我可以通过向量访问实际对象。事实是,程序确实输入了if语句。@Nolf:它是否在j
为零的同一对象上输入了if语句?或者某些对象是su已成功删除,但有些未成功删除(取决于使用的构造函数)?它位于同一对象上,所有对象的问题都相同。我确定问题不在构造函数上,因为我使用相同的向量从文件加载/保存,然后成功保存所有对象。