Umgeht man den Konstruktor einer Klasse legal oder führt dies zu undefiniertem Verhalten?

Consider folgenden Beispielcode:

class C
{
public:
    int* x;
};

void f()
{
    C* c = static_cast<C*>(malloc(sizeof(C)));
    c->x = nullptr; // <-- here
}

Wenn ich aus irgendeinem Grund mit dem nicht initialisierten Speicher leben müsste (natürlich, wenn möglich, würde ich @ anrufnew C() stattdessen), ich nochkönnte Rufen Sie den Placement-Konstruktor auf. Aber wenn ich das wie oben weglasse und @ initialisiejede member-Variable manuell, führt dies zu undefiniertem Verhalten? Das heißt umgeht der Konstruktor per se ein undefiniertes Verhalten oder ist es zulässig, den Aufruf durch einen äquivalenten Code außerhalb der Klasse zu ersetzen?

(Kam über eine andere Frage in einer ganz anderen Angelegenheit darüber hinweg; um Neugier gebeten ...)

Antworten auf die Frage(12)

Ihre Antwort auf die Frage