<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>Is there any way to know whether this is a GDALComputedDataset if
      everything I have is a GDALDataset pointer? </p>
    <div class="moz-cite-prefix">On 24/10/2025 12:55, Even Rouault
      wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:36b2649b-ff1f-4e7a-97e2-f0afe1f6f142@spatialys.com">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <p>Hi,</p>
      <p>you should not destroy the dataset of a GDALComputedRasterBand.
        The GDALComputedRasterBand destructor does that automatically.</p>
      <p>Even<br>
      </p>
      <div class="moz-cite-prefix">Le 24/10/2025 à 12:40, Momtchil
        Momtchev via gdal-dev a écrit :<br>
      </div>
      <blockquote type="cite"
        cite="mid:ca1ad9f2-6ee1-435e-aae5-0c995fb09ca6@momtchev.com">
        <meta http-equiv="content-type"
          content="text/html; charset=UTF-8">
        <p>I have modified one of the algebra examples as follows:</p>
        <div
style="color: #cccccc;background-color: #1f1f1f;font-family: Cascadia Code, Menlo, Monaco, 'Courier New', monospace, Menlo, Monaco, 'Courier New', monospace;font-weight: normal;font-size: 12px;line-height: 18px;white-space: pre;"><div><span
        style="color: #c586c0;">#include</span><span
        style="color: #569cd6;"> </span><span style="color: #ce9178;"><gdal_priv.h></span></div>
<div><span style="color: #569cd6;">int</span><span
        style="color: #cccccc;"> </span><span style="color: #dcdcaa;">main</span><span
        style="color: #cccccc;">() {</span></div><div><span
        style="color: #cccccc;">  </span><span style="color: #dcdcaa;">GDALAllRegister</span><span
        style="color: #cccccc;">();</span></div>
<div><span style="color: #cccccc;">  </span><span
        style="color: #569cd6;">auto</span><span style="color: #cccccc;"> </span><span
        style="color: #9cdcfe;">poDS</span><span style="color: #cccccc;"> </span><span
        style="color: #d4d4d4;">=</span><span style="color: #cccccc;"> </span><span
        style="color: #4ec9b0;">std</span><span style="color: #cccccc;">::</span><span
        style="color: #4ec9b0;">unique_ptr</span><span
        style="color: #cccccc;"><</span><span style="color: #4ec9b0;">GDALDataset</span><span
        style="color: #cccccc;">>(</span><span
        style="color: #4ec9b0;">GDALDataset</span><span
        style="color: #cccccc;">::</span><span style="color: #dcdcaa;">Open</span><span
        style="color: #cccccc;">(</span><span style="color: #ce9178;">"test/data/a39se10.jpg"</span><span
        style="color: #cccccc;">));</span></div><div><span
        style="color: #cccccc;">  </span><span style="color: #569cd6;">auto</span><span
        style="color: #cccccc;"> </span><span style="color: #d4d4d4;">&</span><span
        style="color: #9cdcfe;">R</span><span style="color: #cccccc;"> </span><span
        style="color: #d4d4d4;">=</span><span style="color: #cccccc;"> </span><span
        style="color: #d4d4d4;">*</span><span style="color: #cccccc;">(</span><span
        style="color: #9cdcfe;">poDS</span><span style="color: #dcdcaa;">-></span><span
        style="color: #dcdcaa;">GetRasterBand</span><span
        style="color: #cccccc;">(</span><span style="color: #b5cea8;">1</span><span
        style="color: #cccccc;">));</span></div><div><span
        style="color: #cccccc;">  </span><span style="color: #569cd6;">auto</span><span
        style="color: #cccccc;"> </span><span style="color: #d4d4d4;">&</span><span
        style="color: #9cdcfe;">G</span><span style="color: #cccccc;"> </span><span
        style="color: #d4d4d4;">=</span><span style="color: #cccccc;"> </span><span
        style="color: #d4d4d4;">*</span><span style="color: #cccccc;">(</span><span
        style="color: #9cdcfe;">poDS</span><span style="color: #dcdcaa;">-></span><span
        style="color: #dcdcaa;">GetRasterBand</span><span
        style="color: #cccccc;">(</span><span style="color: #b5cea8;">2</span><span
        style="color: #cccccc;">));</span></div><div><span
        style="color: #cccccc;">  </span><span style="color: #569cd6;">auto</span><span
        style="color: #cccccc;"> </span><span style="color: #d4d4d4;">&</span><span
        style="color: #9cdcfe;">B</span><span style="color: #cccccc;"> </span><span
        style="color: #d4d4d4;">=</span><span style="color: #cccccc;"> </span><span
        style="color: #d4d4d4;">*</span><span style="color: #cccccc;">(</span><span
        style="color: #9cdcfe;">poDS</span><span style="color: #dcdcaa;">-></span><span
        style="color: #dcdcaa;">GetRasterBand</span><span
        style="color: #cccccc;">(</span><span style="color: #b5cea8;">3</span><span
        style="color: #cccccc;">));</span></div><div><span
        style="color: #cccccc;">  </span><span style="color: #4ec9b0;">GDALRasterBand</span><span
        style="color: #cccccc;"> </span><span style="color: #d4d4d4;">*</span><span
        style="color: #9cdcfe;">graylevel</span><span
        style="color: #cccccc;"> </span><span style="color: #d4d4d4;">=</span><span
        style="color: #cccccc;"> </span><span style="color: #c586c0;">new</span><span
        style="color: #cccccc;"> </span><span style="color: #4ec9b0;">GDALComputedRasterBand</span><span
        style="color: #cccccc;">((</span><span style="color: #b5cea8;">0.299</span><span
        style="color: #cccccc;"> </span><span style="color: #dcdcaa;">*</span><span
        style="color: #cccccc;"> </span><span style="color: #9cdcfe;">R</span><span
        style="color: #cccccc;"> </span><span style="color: #dcdcaa;">+</span><span
        style="color: #cccccc;"> </span><span style="color: #b5cea8;">0.587</span><span
        style="color: #cccccc;"> </span><span style="color: #dcdcaa;">*</span><span
        style="color: #cccccc;"> </span><span style="color: #9cdcfe;">G</span><span
        style="color: #cccccc;"> </span><span style="color: #dcdcaa;">+</span><span
        style="color: #cccccc;"> </span><span style="color: #b5cea8;">0.114</span><span
        style="color: #cccccc;"> </span><span style="color: #dcdcaa;">*</span><span
        style="color: #cccccc;"> </span><span style="color: #9cdcfe;">B</span><span
        style="color: #cccccc;">).</span><span style="color: #dcdcaa;">AsType</span><span
        style="color: #cccccc;">(</span><span style="color: #4fc1ff;">GDT_Byte</span><span
        style="color: #cccccc;">));</span></div>
<div><span style="color: #cccccc;">  </span><span
        style="color: #569cd6;">auto</span><span style="color: #cccccc;"> </span><span
        style="color: #9cdcfe;">poGTiffDrv</span><span
        style="color: #cccccc;"> </span><span style="color: #d4d4d4;">=</span><span
        style="color: #cccccc;"> </span><span style="color: #dcdcaa;">GetGDALDriverManager</span><span
        style="color: #cccccc;">()-></span><span
        style="color: #dcdcaa;">GetDriverByName</span><span
        style="color: #cccccc;">(</span><span style="color: #ce9178;">"GTiff"</span><span
        style="color: #cccccc;">);</span></div><div><span
        style="color: #cccccc;">  </span><span style="color: #4ec9b0;">std</span><span
        style="color: #cccccc;">::</span><span style="color: #4ec9b0;">unique_ptr</span><span
        style="color: #cccccc;"><</span><span style="color: #4ec9b0;">GDALDataset</span><span
        style="color: #cccccc;">>(</span></div><div><span
        style="color: #cccccc;">    </span><span style="color: #9cdcfe;">poGTiffDrv</span><span
        style="color: #cccccc;">-></span><span
        style="color: #dcdcaa;">CreateCopy</span><span
        style="color: #cccccc;">(</span><span style="color: #ce9178;">"graylevel.tif"</span><span
        style="color: #cccccc;">, </span><span style="color: #9cdcfe;">graylevel</span><span
        style="color: #cccccc;">-></span><span
        style="color: #dcdcaa;">GetDataset</span><span
        style="color: #cccccc;">(), </span><span style="color: #569cd6;">false</span><span
        style="color: #cccccc;">, </span><span style="color: #569cd6;">nullptr</span><span
        style="color: #cccccc;">, </span><span style="color: #569cd6;">nullptr</span><span
        style="color: #cccccc;">, </span><span style="color: #569cd6;">nullptr</span><span
        style="color: #cccccc;">))</span></div><div><span
        style="color: #cccccc;">    .</span><span
        style="color: #dcdcaa;">reset</span><span
        style="color: #cccccc;">();</span></div>
<div><span style="color: #cccccc;">  </span><span
        style="color: #4ec9b0;">GDALDataset</span><span
        style="color: #cccccc;"> </span><span style="color: #d4d4d4;">*</span><span
        style="color: #9cdcfe;">dh</span><span style="color: #cccccc;"> </span><span
        style="color: #d4d4d4;">=</span><span style="color: #cccccc;"> </span><span
        style="color: #9cdcfe;">graylevel</span><span
        style="color: #cccccc;">-></span><span
        style="color: #dcdcaa;">GetDataset</span><span
        style="color: #cccccc;">();</span></div><div><span
        style="color: #cccccc;">  </span><span style="color: #c586c0;">delete</span><span
        style="color: #cccccc;"> </span><span style="color: #9cdcfe;">graylevel</span><span
        style="color: #cccccc;">;</span></div><div><span
        style="color: #cccccc;">  </span><span style="color: #9cdcfe;">dh</span><span
        style="color: #cccccc;">-></span><span
        style="color: #dcdcaa;">Close</span><span
        style="color: #cccccc;">();</span></div><div><span
        style="color: #cccccc;">  </span><span style="color: #c586c0;">return</span><span
        style="color: #cccccc;"> </span><span style="color: #b5cea8;">0</span><span
        style="color: #cccccc;">;</span></div><div><span
        style="color: #cccccc;">}</span></div></div>
        <p>I allocate graylevel on the heap, I obtain a pointer to the
          GDALComputedDataset and I attempt to destroy first the
          GDALComputedRasterBand then the GDALComputedDataset. This
          fails with a crash in Close. Is this a bug or am I not
          supposed to do this? I am doing it, because this is the usual
          chain of destruction events for objects returned to JS.
          RasterBands hold a reference to their Dataset in order to
          prevent the object from being GCed.</p>
        <pre class="moz-signature" cols="72">-- 
Momtchil Momtchev <a class="moz-txt-link-rfc2396E"
        href="mailto:momtchil@momtchev.com" moz-do-not-send="true"><momtchil@momtchev.com></a></pre>
        <br>
        <fieldset class="moz-mime-attachment-header"></fieldset>
        <pre class="moz-quote-pre" wrap="">_______________________________________________
gdal-dev mailing list
<a class="moz-txt-link-abbreviated moz-txt-link-freetext"
        href="mailto:gdal-dev@lists.osgeo.org" moz-do-not-send="true">gdal-dev@lists.osgeo.org</a>
<a class="moz-txt-link-freetext"
        href="https://lists.osgeo.org/mailman/listinfo/gdal-dev"
        moz-do-not-send="true">https://lists.osgeo.org/mailman/listinfo/gdal-dev</a>
</pre>
      </blockquote>
      <pre class="moz-signature" cols="72">-- 
<a class="moz-txt-link-freetext" href="http://www.spatialys.com"
      moz-do-not-send="true">http://www.spatialys.com</a>
My software is free, but my time generally not.</pre>
    </blockquote>
    <pre class="moz-signature" cols="72">-- 
Momtchil Momtchev <a class="moz-txt-link-rfc2396E" href="mailto:momtchil@momtchev.com"><momtchil@momtchev.com></a></pre>
  </body>
</html>