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
}
我在 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
}