将数组信息存储到 c++ 向量中有一个"Access violation reading location"
Storing array information into c++ vector has an "Access violation reading location"
当我尝试将顶点和三角形面信息加载到向量中时,我得到"访问冲突读取位置"。
这是我的加载代码:
struct TriangleData {
PointEntry *ptidx[3];
bool deleted;
};
class PointEntry {
public:
float x, y, z;
std::vector<TriangleData*> trianglelist;
friend bool operator < (const PointEntry&a, const PointEntry&b) { return (a.x < b.x) || ((a.x == b.x) && (a.y < b.y)) || ((a.x == b.x) && (a.y == b.y) && (a.z < b.z)); };
friend bool operator == (const PointEntry&a, const PointEntry&b) { return !(a<b) && !(b<a); }
friend bool operator != (const PointEntry&a, const PointEntry&b) { return !(a == b); }
};
for (int i = 0; i < num_triangles; i++) {
PointEntry tmp;
PointEntry *p;
for (int j = 0; j<3; j++) {
tmp.x = verts[3 * indicies[3 * i + j] + 0];
tmp.y = verts[3 * indicies[3 * i + j] + 1];
tmp.z = verts[3 * indicies[3 * i + j] + 2];
auto found = find(points.begin(), points.end(), tmp);
if (found == points.end()) {
points.push_back(tmp);
p = (PointEntry *)&(*(find(points.begin(), points.end(), tmp)));
}
else {
p = (PointEntry *)&(*found);
}
if (p->trianglelist.capacity() < 20) {
p->trianglelist.reserve(20);
}
triangle.ptidx[j] = p;
}
triangle.deleted = false;
tlist.push_front(triangle);
std::list<TriangleData>::iterator tri = tlist.begin();
TriangleData* t = &*tri;
PointEntry *pt = t->ptidx[0];
pt->trianglelist.push_back(t); ***// fails here!***
pt = t->ptidx[1];
pt->trianglelist.push_back(t);
pt = t->ptidx[2];
pt->trianglelist.push_back(t);
}
代码总是在我尝试push_back我的三角数据*时中断。 我尝试单步执行每一行代码,但我还没有弄清楚为什么会发生这种情况。
有趣的是,当我使用Set数据结构而不是Vector时,代码工作正常,它按预期输出原始模型。
关于我为什么访问无效位置的任何建议都会有所帮助,谢谢!
有趣的是,当我使用 Set 数据结构而不是 向量,代码工作正常,它将原始模型输出为 预期。
这是您问题的解决方案,使用 set 而不是向量。
如果points
是 Vector,则无法存储指向 Vector 项的指针,因为在调用时push_back
Vector 项被重新分配,并且指向它们的指针无效。
打电话给push_back
后
points.push_back(tmp);
所有以前的作业都p
喜欢
p = (PointEntry *)&(*found);
可能引用无效指针。
您的程序崩溃,因为您想要访问无效指针的成员trianglelist
pt->trianglelist.push_back(t); ***// fails here!***
相关文章:
- 有一个打印语句的函数是一种糟糕的编程实践吗
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 有没有可能有一个只有ADL才能找到的非好友功能
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 在学习数据结构之前对STL有一个了解是好的吗?
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 我的输出中有一个额外的 0,为什么会这样
- 节点是否为空,即使它有一个值?
- 将数组信息存储到 c++ 向量中有一个"Access violation reading location"
- 在 Stream C++ 文本之前有一个额外的换行符
- 我可以有一个 ELI5 作为参考和指针以及何时使用它们吗?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 我有一个类,它创建了另一个类的实例.如何将变量通过第一个类传递到第二个类的实例化中?
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 有一个构造函数,但有两个析构函数
- 我有一个关于C++提升的问题:: asio 和 std :: 异步