On 12.06.2024 23:56, bachmeier wrote:
On Wednesday, 12 June 2024 at 20:37:36 UTC, drug007 wrote:
On 12.06.2024 21:57, bachmeier wrote:
On Wednesday, 12 June 2024 at 18:36:26 UTC, Vinod K Chandran wrote:
On Wednesday, 12 June 2024 at 15:33:39 UTC, bachmeier wrote:
A SafeRefCounted example with main marked @nogc:

```
import std;
import core.stdc.stdlib;

struct Foo {
  double[] data;
  double * ptr;
  alias data this;

  @nogc this(int n) {
    ptr = cast(double*) malloc(n*double.sizeof);
    data = ptr[0..n];
    printf("Data has been allocated\n");
  }
 }

```

Why not just use `ptr` ? Why did you `data` with `ptr` ?

Try `foo[10] = 1.5` and `foo.ptr[10] = 1.5`. The first correctly throws an out of bounds error. The second gives `Segmentation fault (core dumped)`.

I think you can use data only because data contains data.ptr

Yes, but you get all the benefits of `double[]` for free if you do it that way, including the more concise foo[10] syntax.

I meant you do not need to add `ptr` field at all
```D
import std;
import core.stdc.stdlib;

struct Foo {
@nogc:
    double[] data;
    alias data this;

    this(int n)
    {
        auto ptr = cast(double*) malloc(n*double.sizeof);
        data = ptr[0..n];
    }
}

@nogc void main() {
    auto foo = SafeRefCounted!Foo(3);
    foo[0..3] = 1.5;
    printf("%f %f %f\n", foo[0], foo[1], foo[2]);
    foo.ptr[10] = 1.5; // no need for separate ptr field
}
```

Reply via email to