On 23 May 2018 at 06:36, Steven Schveighoffer via Digitalmars-d
<digitalmars-d@puremagic.com> wrote:
> On 5/22/18 9:48 PM, Manu wrote:
>>
>> On 22 May 2018 at 06:44, Steven Schveighoffer via Digitalmars-d
>> <digitalmars-d@puremagic.com> wrote:
>>>
>>> On 5/22/18 1:01 AM, Manu wrote:
>>>>
>>>> Ah! Dangling pointers... that might conservatively retain garbage.
>>>> That's a good reason.
>>>
>>>
>>>
>>> Well, I was thinking more along the lines of accessing memory that is no
>>> longer valid :) A destructor can, for instance, free C malloced memory.
>>
>>
>> The memory post-destruction is invalid... nobody will access it.
>> Accessing it should be undefined behaviour until such a time as the
>> memory is re-constructed with a new instance...
>>
>
> This particular sub-thread was about using destroy on something, not freeing
> the memory. The memory is not invalid.
>
> To clarify, I'm talking about something like this:
>
> struct S
> {
>   int *foo;
>   this(int x) { foo = cast(int*)malloc(int.sizeof); }
>   ~this() { free(foo); }
> }
>
> auto s = S(1);
> destroy(s);
> *s.foo = 5; // oops
>
> If s.foo is reset to null, then you get a nice predictable segfault. If not,
> then you get memory corruption. Sure you can just say "undefined behavior",
> but I'd rather the defined behavior.

Yeah no... I'm happy with "accessing uninitialised memory is undefined
behaviour".
If you want defined behaviour; initialise the memory!

Reply via email to