<!DOCTYPE html>
<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <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"><momtchil@momtchev.com></a></pre>
  </body>
</html>