在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++];
问题
- 该错误产生的原因是什么?
- 我将C代码集成到C++项目中的方式是否正确?
内容的提问来源于stack exchange,提问作者BenPol
相关产品推荐
相关产品推荐

