On Wednesday, 10 September 2025 at 14:31:27 UTC, IchorDev wrote:
On Wednesday, 10 September 2025 at 13:13:34 UTC, Richard (Rikki) Andrew Cattermole wrote:
Placement new is @system, but you wanted to use it in an @safe function iff the constructor to be called is @safe as well.

Pretty much.

The reason placement new is @system is because of double-init. It can't be a safe operation.

What?! Like, it assigns to the memory twice? What's the point of this feature, then? I thought this could essentially replace `emplace` for constructing types into uninitialised memory, but instead it's just a booby-trap that stops people from making their code `@safe`?

The problem is not really with placement new, it's with constructors. Constructors are allowed to mutate immutable objects (under the assumption that they are initializing a newly-created object). If you call a constructor twice on the same immutable object, which is possible with placement new, it can result in undefined behavior.

In fact, it is also possible to trigger UB this way by simply calling the constructor manually: https://github.com/dlang/dmd/issues/20248
  • Re: Placement ne... Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn
    • Re: Placeme... IchorDev via Digitalmars-d-learn
      • Re: Pla... Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn
        • Re:... IchorDev via Digitalmars-d-learn
          • ... Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn
            • ... IchorDev via Digitalmars-d-learn
              • ... Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn
              • ... IchorDev via Digitalmars-d-learn
          • ... Paul Backus via Digitalmars-d-learn
            • ... IchorDev via Digitalmars-d-learn
              • ... Nick Treleaven via Digitalmars-d-learn

Reply via email to