[gdal-dev] Question on OGR handle types

Even Rouault even.rouault at mines-paris.org
Fri Aug 7 13:35:45 EDT 2009


Answers below

P.S. : Don't forget to use 'Answer to all' when answering to a post so that 
the list is CC'ed

----- Original Message ----- 
From: "Stefan Moebius" <stefan.moebius at actix.com>
To: "Even Rouault" <even.rouault at mines-paris.org>
Sent: Friday, August 07, 2009 11:45 AM
Subject: Re: [gdal-dev] Question on OGR handle types


> Even,
>
> Thanks for your reply.
>
> No we aren't actually afraid to use casts, we were just wondering what the 
> point is in changing the GDAL sources to improve type safety, just to tell 
> users to use not-really-type safe casts?

That depends on the point of view. The change to turn all "type void* foo" 
into something more specific enabled us to discover bugs in code using the C 
API in a few places inside GDAL itself as all C handles were equivalent 
before.

>
> > 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.
>
> Yes, that's exactly what we do argue ;-)
> (The pure-C way is not an option in our case.)
>
> Would it make sense for us to come up with a patch for adding this 
> function?

Patch welcome. Please post it as an attachement to a ticket in GDAL Trac. It 
should be done against svn trunk code ideally.

>
> Cheers,
> Stefan
>
> Even Rouault wrote:
>> 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
>
> 




More information about the gdal-dev mailing list