<div dir="ltr"><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">Short version:</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">I have a struct A* aptr allocated in C/C++ with an internal pointer aptr->ptr (say a double*)<br>
</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">I want to store a reference x (say double[]) in D to aptr only through aptr->ptr, not through aptr directly as it's inconvenient in my use case.</div>
<div style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br></div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">How do I achieve that, so that when x goes out of scope, some deallocator for aptr will be called ?</div>
<div style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br></div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">Long version:</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">
----</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">suppose I have C++ code:<br></div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">struct A{</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">
  double*ptr;</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">  A(size_t n){ptr=(double*)malloc(n);}</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">  ~A(){free(ptr);}</div>
<div style="font-family:arial,sans-serif;font-size:12.727272033691406px">};<br></div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br></div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">
and a D wrapper around it:</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">extern(C){struct A; A*A_new(size_t n); void A_delete(A*a); double*A_ptr(A*a);}</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">
<br></div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">I want to use it as follows:<br></div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br></div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">
double[] get_x(size_t n){</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px"> return A_new(n).A_ptr[0..n];</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">}</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">
<br></div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">void main(){</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">  double[]x=get_x(n);</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">
// do something with x;</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">}<br></div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">----</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">
<br></div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">It's trivial to handle this via a class wrapper:</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">class A2{</div>
<div style="font-family:arial,sans-serif;font-size:12.727272033691406px">A*a;</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">this(size_t n){a=A_new(n);}</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">
~this(){A_delete(n);}</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">double*ptr(){return A_ptr(a);}</div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">}<br></div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">
<div>double[] get_x(size_t n){</div><div> auto a2=new A2(n);<br></div><div> return a2.ptr;</div><div>//this doesn't help much though, A2 will go out of scope when this function exits.</div><div>}</div></div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">
<br></div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br></div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">but I don't want to maintain objects of class A2 around, just double[] slices as above.</div>
<div style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br></div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">Is there some magic involving core.memory.addRoot,addRange (etc) I can use so that a2 stays alive as long as x stays alive? (in which case when x goes out of scope, 'a2' will too, and will call A_delete).</div>
<div style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br></div><div style="font-family:arial,sans-serif;font-size:12.727272033691406px">Thanks</div></div>