设置对指向数据块中对象的指针的引用会导致System.AccessViolationException 我是C++的新手,我必须在现有项目中实现一个特性。为了做到这一点,我必须创建某种类型的动态集合,所以最初使用了向量。读过之后,我觉得戴克可能更适合这个目的。在主应用程序中,我在标题中声明一个deque std::deque<CSomeObject> SomeObjects; std::定义一些对象;

设置对指向数据块中对象的指针的引用会导致System.AccessViolationException 我是C++的新手,我必须在现有项目中实现一个特性。为了做到这一点,我必须创建某种类型的动态集合,所以最初使用了向量。读过之后,我觉得戴克可能更适合这个目的。在主应用程序中,我在标题中声明一个deque std::deque<CSomeObject> SomeObjects; std::定义一些对象;,c++,multithreading,C++,Multithreading,应用程序具有线程池,这些线程池在调用threadmanager.GenerateAndProcessJobList()时启动。threadmanager在主应用程序中初始化,对SomeObjects的引用被传递到构造函数中。创建辅助对象时,对SomeObjects的引用被传递到辅助构造函数中。我有一个函数,可以在deque中找到一个特定的对象,如果找不到,就插入它。这是从工人内部调用的: bool FindSomeObject(std::deque<CSomeObject> &

应用程序具有线程池,这些线程池在调用threadmanager.GenerateAndProcessJobList()时启动。threadmanager在主应用程序中初始化,对SomeObjects的引用被传递到构造函数中。创建辅助对象时,对SomeObjects的引用被传递到辅助构造函数中。我有一个函数,可以在deque中找到一个特定的对象,如果找不到,就插入它。这是从工人内部调用的:

bool FindSomeObject(std::deque<CSomeObject> & SomeObjectVector,int ObjectID,CSomeObject *& ObjectRef){
    try{
        int CurrentObjectID;
        int vLength = SomeObjectVector.size();
        int i = 0;
        while(i < vLength){
            CSomeObject * cur = &SomeObjectVector[i];
            cur->GetIDs(CurrentObjectID);
            if(CurrentObjectID == ObjectID){
                ObjectRef = cur;    
                return true;
            }
            i++;
        }
        CSomeObject new_obj;
        new_obj.SetIDs(ObjectID);
        SomeObjectVector.push_back(new_obj);
        ObjectRef =  &SomeObjectVector.back();
        return true;
    }catch(std::exception& e){
        printf(e.what()); 
        return false;
    }
} 
bool-FindSomeObject(std::deque&SomeObjectVector、int-ObjectID、CSomeObject*&ObjectRef){
试一试{
int-CurrentObjectID;
int vLength=SomeObjectVector.size();
int i=0;
而(igetid(CurrentObjectID);
如果(CurrentObjectID==ObjectID){
ObjectRef=cur;
返回true;
}
i++;
}
CSomeObject new_obj;
新对象集合ID(ObjectID);
SomeObjectVector.push_back(新的_对象);
ObjectRef=&SomeObjectVector.back();
返回true;
}捕获(标准::异常&e){
printf(即what());
返回false;
}
} 
应用程序中断,出现异常“System.AccessViolationException”。查看调用堆栈,中断发生在调用FindSomeObject的点附近。我知道deque不是线程安全的。关于StackOverflow的其他问题意味着,这种问题可能是由多个线程试图同时访问同一个对象或引用的初始对象在其时间之前被销毁而引起的。我确信该对象应该仍然存在,因为它在主应用程序的范围内,我的手表向我显示了成功推送到它上的对象


对此,我们将一如既往地非常感谢您的任何意见。如果我将所有必要的对象从主线程推回到SomeObjects,这是否有助于解决问题

不要存储
std::deque
std::vector
条目的地址。如果这些容器中的任何一个被调整了大小,那么对这些项目的指针和引用就会失效。基本上,这是可疑的:
CSomeObject*cur=&SomeObjectVector[i]然后
ObjectRef=cur(加上其他类似行)。使用
std::vector
std::deque
容易导致迭代器/指针无效。如果迭代器无效,则
ObjectRef
指向的任何对象也无效。嗨,PaulMcKenzie,谢谢您的输入。标准容器库中是否有我可以这样使用的集合,并且不会使我的指针/迭代器无效?此外,如果我将find函数更改为在将对象移动到devque后面后修改对象的函数,这是否意味着在devque后面更改对象的参数是安全的?您可以使用
std::list
,但请记住,您将没有随机访问迭代器。或者您可以
reserve()
使用最大条目数预先调整向量大小(但这需要确保最大条目数)。