Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 擦除静态向量中元素';自毁函数_C++_Visual C++_Pointers_Destructor_Stdvector - Fatal编程技术网

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已成功删除,但有些未成功删除(取决于使用的构造函数)?它位于同一对象上,所有对象的问题都相同。我确定问题不在构造函数上,因为我使用相同的向量从文件加载/保存,然后成功保存所有对象。