【发布时间】:2015-03-14 05:21:50
【问题描述】:
我必须为仅具有旧式“写出指针”访问器的 API 创建一个迭代器。有问题的 API 是 OGR 的;有问题的课程之一是OGRLineString(供参考:http://www.gdal.org/classOGRLineString.html)。该类存储了一些点,可以使用以下getter方法访问:
void OGRLineString::getPoint(int pos, OGRPoint *out)
为了使用访问器,创建一个新的OGRPoint 对象并将指向它的指针传递给方法,该方法将数据写入分配的对象。例如:
OGRPoint *p = new OGRPoint();
lineString->getPoint(0, p);
现在,我想实现一个(类似 STL)的迭代器。即使我在各处放置大警告标志,说明提供的OGRPoints 是不可修改的(即const),并且如果另一段代码修改了正在迭代的OGRLineString,我也不会更新,我得到OGRPoint const &operator*() const 的内存泄漏问题,因为 API 要求我传递自定义分配的 OGRPoint 实例,但迭代器必须分配一个。另外,当迭代器本身被删除时,迭代器返回的OGRPoints 不应该被删除。此外,OGRLineString 不存储为getPoint 复制的OGRPoint 的实际实例,而是存储x/y/z 坐标的简单结构;所有必需的附加信息(例如,空间参考)都复制到访问器中。因此,一个简单的#define private public hack 将无济于事。
是否有任何理智/干净的方式来添加迭代器而不修改OGRLineString 的原始来源?例如,有没有办法向原始类添加特性或修改它,就像 Ruby 的“猴子补丁”特性那样?或者观察容器的生命周期以清理迭代器返回的OGRPoint 实例?
【问题讨论】:
-
你应该看看
vector<bool>::operator[]是如何工作的,它会告诉你如何解决这个怪癖。 -
你现在在做什么导致内存泄漏?为什么迭代器不管理
OGRPoint?你的迭代器是做什么的? -
OGRPoint 可以与价值语义一起使用吗?即它有复制构造函数等?在这种情况下,请这样做,而不是“新建”。如果没有,请使用智能指针
标签: c++ pointers stl iterator ogr