std::vector push_back 上的访问冲突

std::vector access violation on push_back

我在 class 中有一个这样的方法:

int Class1::addObject(Struct1 object)
{
   object.objectID = objCounter;
   objCounter++;
   vector1.push_back(object); // this line throws exception
   // unrelated line
   return object.objectID;
} 

向量定义和初始化如下:

    std::vector<Struct1> vector1 = {};

最大的问题是有时会出现这个异常,恐怕是内存泄漏。 我正在使用 C++14,我认为这没有问题(因为我在某处读到,在 C++11 向量被禁止之前)。此外,Struct1 对象在调用此方法之前已初始化,因此两者都不是。 可能是因为 Visual Studio 没有管理员权限,或者可能是由于 vector 在添加更多元素时更改了内存中的位置并且进程无法分配更多内存(我认为可能是这样)?第三个可能的嫌疑人是多线程:因为我当时正在使用 4 个线程访问 Class1,但是每个线程都有它自己的对象组 adds/removes,并且对于 2 个或更多线程,该组永远不会相同?

更新一: Struct1 的定义(当有人在答案中建议时添加复制和默认构造函数)

struct Struct1
{
  int objectID;
  Struct1ObjectType objectType;
  GLfloat array1[2];
  GLfloat array2[3];
  GLfloat objectSize;

  Struct1() {}

  Struct1(const Struct1& cs1) 
  {
    objectID = cs1.objectID;
    objectType = cs1.objectType;
    for (int i = 0; i < 2; i++)
        array1[i] = cs1.array1[i];
    
    for (int i = 0; i < 3; i++)
        array2[i] = cs1.array2[i];

    objectSize = cs1.objectSize;
  }
};

C++ 标准库对其集合中的元素使用“复制语义”。代码行 vector1.push_back(object); 导致 Struct1 对象(存储在 std::vector<> 中的对象是参数中对象的副本)的复制构造。

你没有显示 class Struct1 的定义,所以我不知道它是如何被复制构造的,但我会检查那里看看你是否有编程错误那个代码。

回复:

The third possible suspect is multithreading: since I am accessing Class1 with 4 threads at the time, but every thread has it's own group of objects that it adds/removes, and that group is never the same for 2 or more threads?

无论对象是否不同,您都无法在没有同步的情况下从多个线程访问同一个向量。

一种方法是使用 mutex:

std::mutex m_lock;

然后当您需要访问该向量时:

{   
    const std::lock_guard<std::mutex> l(m_lock);
    vector1.push_back(object); // this line throws exception
}