You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 18:18:04