[gdal-dev] Question on OGR handle types

Even Rouault even.rouault at mines-paris.org
Wed Aug 5 14:24:12 EDT 2009


Stefan,

Why are you so much afraid about using cast ? ;-) This is probably the
easiest solution for you :
OGRCoordinateTransformation* poCT =
OGRCreateCoordinateTransformation(poSRS1, poSRS2);
OCTDestroyCoordinateTransformation( (OGRCoordinateTransformationH) poCT);

No worry to have. It's exactly the kind of casts done in GDAL/OGR C API
wrappers to call the C++ API.
For example :

OGRCoordinateTransformationH CPL_STDCALL OCTNewCoordinateTransformation(
  OGRSpatialReferenceH hSourceSRS, OGRSpatialReferenceH hTargetSRS )
{
  return (OGRCoordinateTransformationH)
    OGRCreateCoordinateTransformation(   (OGRSpatialReference *) hSourceSRS,
(OGRSpatialReference *) hTargetSRS );
}

void CPL_STDCALL OCTDestroyCoordinateTransformation(
OGRCoordinateTransformationH hCT )
{
  delete (OGRCoordinateTransformation *) hCT;
}

Otherwise, as you've noted, the stricter typing is only enforced when DEBUG
is defined.
So your code should compile without any change if you don't define DEBUG.

The fundamental issue in fact is that you're mixing use of C++ API and C
API.
A pure C solution would be to use the pair
OCTNewCoordinateTransformation()/OCTDestroyCoordinateTransformation().
For the C++ part, we could argue there's a lack of a static void
OGRCoordinateTransformation::Destroy(OGRCoordinateTransformation*) method
to avoid using the delete operator, which can be an issue on Windows.

----- Original Message ----- 
From: "Stefan Moebius" <stefan.moebius at actix.com>
To: <gdal-dev at lists.osgeo.org>
Sent: Wednesday, August 05, 2009 5:59 PM
Subject: [gdal-dev] Question on OGR handle types


> Hi,
>
> In May 2008, a couple of changes where made to improve type checking.
>
> See http://lists.osgeo.org/pipermail/gdal-dev/2008-May/017059.html
> http://trac.osgeo.org/gdal/changeset/14435
> http://trac.osgeo.org/gdal/changeset/14441
>
> Our code is using the function
>
> OGRCoordinateTransformation* OGRCreateCoordinateTransformation
> (OGRSpatialReference * poSource,
> OGRSpatialReference * poTarget)
>
> and with the upgrade from 1.5 to 1.6, we now cannot properly destroy the 
> OGRCoordinateTransformation anymore (at least in debug mode).
>
> The documentation of that create function says:
>
>> Create transformation object.
>>
>> This is the same as the C function OCTNewCoordinateTransformation().
>>
>> Input spatial reference system objects are assigned by copy (calling 
>> clone() method) and no ownership transfer occurs.
>>
>> The delete operator, or OCTDestroyCoordinateTransformation() should be 
>> used to destroy transformation objects.
>
> As we are linking the GDAL dynamically, using delete is not really an 
> option as we cannot predict what heap was used to create the object. The 
> destroy function, however, requires a parameter of type 
> OGRCoordinateTransformationH, which we cannot cleanly cast to anymore for 
> that change mentioned at the beginning.
>
> What are we missing here? How is this supposed to be used?
>
> Any help is appreciated.
>
> Regards,
> Stefan
>
> -- 
> Stefan Möbius
> Development Manager
>
> Actix GmbH
> Altmarkt 10
> 01067 Dresden
> Germany
>
> T +49 351 40429 17
> www.actix.com
> _______________________________________________
> gdal-dev mailing list
> gdal-dev at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/gdal-dev
>
> 




More information about the gdal-dev mailing list