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

在C++项目中使用Triangle网格生成库时出现内存写入访问冲突

在C++项目中集成Triangle网格库时的写入访问冲突问题

集成步骤

  • 从Triangle官网下载triangle.h和triangle.c文件
  • 在triangle.c中添加宏定义:#define NO_TIMER、#define TRILIBRARY、#define ANSI_DECLARATORS
  • 将triangle.c编译为Triangle.lib并加入项目链接
  • 将triangle.h复制到项目include目录,用extern "C"包裹以适配C++编译,此时项目可正常编译并调用库函数

测试代码(来自tricall.h示例)

#define REAL double

struct triangulateio in, mid, out, vorout;

in.numberofpoints = 4;
in.numberofpointattributes = 1;
in.pointlist = (REAL*)malloc(in.numberofpoints * 2 * sizeof(REAL));
in.pointlist[0] = 0.0;
in.pointlist[1] = 0.0;
in.pointlist[2] = 1.0;
in.pointlist[3] = 0.0;
in.pointlist[4] = 1.0;
in.pointlist[5] = 10.0;
in.pointlist[6] = 0.0;
in.pointlist[7] = 10.0;
in.pointattributelist = (REAL*)malloc(in.numberofpoints * in.numberofpointattributes * sizeof(REAL));
in.pointattributelist[0] = 0.0;
in.pointattributelist[1] = 1.0;
in.pointattributelist[2] = 11.0;
in.pointattributelist[3] = 10.0;
in.pointmarkerlist = (int*)malloc(in.numberofpoints * sizeof(int));
in.pointmarkerlist[0] = 0;
in.pointmarkerlist[1] = 2;
in.pointmarkerlist[2] = 0;
in.pointmarkerlist[3] = 0;

in.numberofsegments = 0;
in.numberofholes = 0;
in.numberofregions = 1;
in.regionlist = (REAL*)malloc(in.numberofregions * 4 * sizeof(REAL));
in.regionlist[0] = 0.5;
in.regionlist[1] = 5.0;
in.regionlist[2] = 7.0;
in.regionlist[3] = 0.1;

/* Make necessary initializations so that Triangle can return a */
/*   triangulation in `mid' and a voronoi diagram in `vorout'.  */

mid.pointlist = (REAL*)NULL;            /* Not needed if -N switch used. */
mid.pointattributelist = (REAL*)NULL;
mid.pointmarkerlist = (int*)NULL; /* Not needed if -N or -B switch used. */
mid.trianglelist = (int*)NULL;          /* Not needed if -E switch used. */
mid.triangleattributelist = (REAL*)NULL;
mid.neighborlist = (int*)NULL;         /* Needed only if -n switch used. */
mid.segmentlist = (int*)NULL;
mid.segmentmarkerlist = (int*)NULL;
mid.edgelist = (int*)NULL;             /* Needed only if -e switch used. */
mid.edgemarkerlist = (int*)NULL;   /* Needed if -e used and -B not used. */

vorout.pointlist = (REAL*)NULL;        /* Needed only if -v switch used. */
vorout.pointattributelist = (REAL*)NULL;
vorout.edgelist = (int*)NULL;          /* Needed only if -v switch used. */
vorout.normlist = (REAL*)NULL;         /* Needed only if -v switch used. */                                         

triangulate(const_cast<char*>("pczAevn"), &in, &mid, &vorout);

错误信息

调用triangulate函数时触发异常:Exception thrown: write access violation. vertexloop was 0x8E064FF0,错误来自triangle.c文件第14130行:

x = vertexloop[0] = pointlist[coordindex++];

问题

  1. 该错误产生的原因是什么?
  2. 我将C代码集成到C++项目中的方式是否正确?

内容的提问来源于stack exchange,提问作者BenPol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 11:04:58