我使用GDAL库中的OGR来管理空间数据。现在我在Mac上拥有我的本地开发环境。提供的代码在Mac上按预期工作。
但是当在生产Ubuntu机器上构建和运行时,我会遇到Segmentation fault(核心转储)。
代码从PostgreSQL表中获取空间数据并循环结果。在循环中,我打算将OGRGeometry分配给指针,然后分配正确的空间参考。但正如前面所述,我得到了分段错误(核心转储)。应用程序的其他部分使用类似的代码,但它们都不在循环中。大多数情况下,应用程序只是为单个几何体指定空间参考,然后继续前进。
我在记忆问题上添加了评论。
OGRSpatialReference epsg3006;
epsg3006.SetWellKnownGeogCS("EPSG:3006");
for (pqxx::result::const_iterator i = r.begin(); i != r.end(); ++i) {
const char* wkt = i["geometry"].as<std::string>().c_str();
// cast because OGR_G_CreateFromWkt will move the pointer
auto pszWkt = (char*) wkt;
OGRGeometry* polygon;
OGRErr err = OGRGeometryFactory::createFromWkt(&pszWkt, &epsg3006, &polygon);
// This line produces the seg fault
polygon->assignSpatialReference(&epsg3006);
// ..omitted code
}
我尝试移动代码:
OGRSpatialReference epsg3006;
epsg3006.SetWellKnownGeogCS("EPSG:3006");
在循环内部没有任何运气。
我尝试使用Valgrind进行调试。但由于here所见的其他问题,它似乎过早地退出了。但这对另一个帖子来说是一个问题。
编辑:现在已经设法让Valgrind工作了。可以找到输出here。 我想问题是在这里释放内存时at 0x553D4E9: OGRSpatialReference::Release() (in /usr/lib/libgdal.so.20.1.3)
但是我没有想法该怎么做。
我没有想法。生产机器上的段错误可能是什么问题?