Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.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++_Pointers_Vector - Fatal编程技术网

C++ 删除向量中的指针时出现分段错误

C++ 删除向量中的指针时出现分段错误,c++,pointers,vector,C++,Pointers,Vector,当用户想要删除对象时,我正在尝试删除向量中的对象指针。我试图: 删除指针 从向量中删除指针 我在数据库类中有一个字符串到向量的映射。向量包含指向对象的指针。像这样: 在“database.h”中定义objectMap和objectector 我正在调试这个程序,我正在打印整个对象图,看看删除是否有效。问题是,即使函数确认删除(即返回true),删除后对象指针仍然存在。有人能解释一下发生了什么事吗 objectVector v = vec->second; 此按值复制向量,因此您指的是副本

当用户想要删除对象时,我正在尝试删除向量中的对象指针。我试图:

  • 删除指针
  • 从向量中删除指针
  • 我在数据库类中有一个字符串到向量的映射。向量包含指向对象的指针。像这样:

    在“database.h”中定义
    objectMap
    objectector

    我正在调试这个程序,我正在打印整个对象图,看看删除是否有效。问题是,即使函数确认删除(即返回true),删除后对象指针仍然存在。有人能解释一下发生了什么事吗

    objectVector v = vec->second;
    
    按值复制向量,因此您指的是副本,而不是实向量

    建议将该行改为

    objectVector& v = vec->second; // Reference to the "real" vector
    

    在使obj迭代器无效方面没有问题,因为一旦遇到删除元素,您就要退出函数。

    您的代码是错误的,至少因为您没有删除原始向量中的元素。使用对向量的引用

    for(objectMap::iterator vec = objects.begin(); vec != objects.end(); ++vec)
    {
        objectVector &v = vec->second;
    

    也考虑一种方法,当在向量中擦除一个元素后,向量变空,也许你还可以删除映射中的相应元素。 例如)未经测试)


    但是
    v.erase(obj)
    是个问题吗?我只是删除一个对象,当我找到它时,我退出循环。我一直在想这个问题,但我仍然需要
    obj=v.erase(obj)如果我在那里退出循环?我认为这只有在你继续循环的时候才有必要。你的意思是下次我想删除一个对象时,这是必要的吗?@patriques对,如果你要退出那里的循环,你就不需要它了。
    
    objectVector& v = vec->second; // Reference to the "real" vector
    
    for(objectMap::iterator vec = objects.begin(); vec != objects.end(); ++vec)
    {
        objectVector &v = vec->second;
    
    bool DataBase::deleteId(int id)
    {
        bool modified = false;
    
        for ( auto it1 = objects.begin(); !modified && it1 != objects.end(); ++it1 )
        {
            auto it2 = std::find_if( it1->second.begin(), it1->second.end(),
                                     [&]( Object *o ) { return ( o->getId() == id ); } );
            modified = it2 != it1->second.end();
    
            if ( modified )
            {
                delete *it2;
                it1->second.erase( it2 );
                if ( it1->second.empty() ) it1 = objects.erase( it1 );
            }
        }
    
        return modified;
    }