digitalmars.D - Should __ArrayDtor be called for uninitialised arrays?
- Teodor Dutu (25/25) Nov 18 2021 Hi,
- Adam D Ruppe (10/11) Nov 18 2021 Yes, this is specified.
- Teodor Dutu (2/5) Nov 18 2021 This worked. Thanks!
Hi,
The following code calls `__ArrayDtor` at the end of `main`.
However, since `arr` is uninitialised, `free(p)` produces a
segmentation fault.
```d
struct S
{
int *p;
~this()
{
free(p);
}
}
void main()
{
S[3] arr = void;
}
```
Is this the expected behaviour? One possible fix is to let the
programmer handle the destruction of void-initialised arrays
themselves.
I am asking because, in
[`_d_arrayctor`](https://github.com/dlang/druntime/blob/0254b3f3dd263fbf7496354c6fcb53026fa44098/src/core/internal/array/
onstruction.d#L73), the `throw` introduces call to `__ArrayDtor`, which
destroys the array `to`. This call is unnecessary, as the `_d_arrayctor`
already destroys the initialised elements of `to`, while the uninitialised ones
need not be destroyed, as I said above.
Thanks,
Teodor
Nov 18 2021
On Thursday, 18 November 2021 at 12:27:54 UTC, Teodor Dutu wrote:Is this the expected behaviour?Yes, this is specified. https://dlang.org/spec/struct.html#struct-destructor It is always called when it goes out of scope. You're supposed to ensure S.init's destructor is a harmless no-op because it is always called. But if you void initialize of course it isn't S.init, it is S.random. But the spec does give you a way to handle destruction yourself: use a union. See more: http://dpldocs.info/this-week-in-d/Blog.Posted_2021_03_15.html#tip-of-the-week
Nov 18 2021
On Thursday, 18 November 2021 at 13:32:32 UTC, Adam D Ruppe wrote:But the spec does give you a way to handle destruction yourself: use a union. See more: http://dpldocs.info/this-week-in-d/Blog.Posted_2021_03_15.html#tip-of-the-weekThis worked. Thanks!
Nov 18 2021








Teodor Dutu <teodor.dutu gmail.com>