C++ Qt中std::vector的push_back运行异常,存入STL三角数据全被末尾值覆盖
问题原因
你所有push进triangles容器的Triangle*都指向同一个内存地址,所有Node指针也同理:你在while循环外部只申请了一次triangle、vertex1、vertex2、vertex3、vn的内存,每次循环只是修改这几个固定内存块的内容,容器里存储的都是重复的同一个指针,自然所有元素最后都会和最后一次修改的结果一致。
修复方法
把内存申请的逻辑移到while循环内部,每次循环都创建新的Triangle和Node对象,修改后核心代码如下:
void dm::Mesh::loadSTL(const QString p_file) { //Open the STL file QFile file(p_file); file.open(QIODevice::ReadOnly | QIODevice::Text); QString line; QTextStream in(&file); line = in.readLine(); // solid while(true) { line = in.readLine().trimmed(); //facet or endsolid if(line.trimmed().startsWith("endsolid")) { break; } // 每次循环重新申请独立内存,不复用全局对象 Node *vn = new Node; Node *vertex1 = new Node; Node *vertex2 = new Node; Node *vertex3 = new Node; Triangle *triangle = new Triangle; *vn = getCoordinateFromString(line); line = in.readLine(); //outer loop line = in.readLine().trimmed(); //vertex 1 *vertex1 = getCoordinateFromString(line); line = in.readLine().trimmed(); //vertex 2 *vertex2 = getCoordinateFromString(line); line = in.readLine().trimmed(); //vertex 3 *vertex3 = getCoordinateFromString(line); line = in.readLine(); //endloop line = in.readLine(); //endfacet triangle->nodes[0] = vertex1; triangle->nodes[1] = vertex2; triangle->nodes[2] = vertex3; for(int i = 0; i<3 ; i++){ triangle->normal[i] = vn->coo[i]; } triangles.push_back(triangle); } file.close(); }
额外优化建议
- 你原代码里的
*triangle->nodes = new Node;属于无效冗余代码,可以直接删除,后续你会给nodes数组赋值为三个vertex的指针,这行申请的内存会直接泄漏。 - 当前用裸指针管理内存,需要注意Mesh析构时要遍历
triangles容器手动释放所有Triangle和对应Node对象,避免内存泄漏。如果没有特殊需求,也可以直接把容器声明为std::vector<Triangle>,直接存储对象不需要手动管理内存,运行效率也更高。
内容的提问来源于stack exchange,提问作者Clem
相关产品推荐
相关产品推荐

