Wywołaj destruktor, a następnie konstruktor (resetowanie obiektu)

Chcę zresetować obiekt. Czy mogę to zrobić w następujący sposób?

anObject->~AnObject();
anObject = new(anObject) AnObject();
// edit: this is not allowed: anObject->AnObject();

Ten kod jest oczywiście podzbiorem typowego cyklu życia obiektu przydzielonego przez umieszczenie nowego:

AnObject* anObject = malloc(sizeof(AnObject));
anObject = new (anObject) AnObject(); // My step 2.
// ...
anObject->~AnObject(); // My step 1.
free(anObject)
// EDIT: The fact I used malloc instead of new doesn't carry any meaning

Jedyną zmianą jest kolejność wywołań konstruktora i destruktora.

Więc dlaczego wnastępujące FAQpojawiają się wszystkie groźby?

[11.9] Ale czy mogę jawnie wywołać destruktor, jeśli przydzieliłem mój obiekt nowym?

FAQ: Nie możesz, chyba że obiekt został przydzielony z nowym miejscem. Obiekty utworzone przez nowe muszą zostać usunięte, co powoduje dwie rzeczy (zapamiętaj je): wywołuje destruktor, a następnie zwalnia pamięć.

FQA: Translation: delete to sposób na wyraźne wywołanie destruktora, ale także zwalnia pamięć. Możesz także wywołać destruktor bez zwolnienia pamięci. W większości przypadków jest to brzydkie i bezużyteczne, ale możesz to zrobić.

Wywołanie destruktora / konstruktora jest oczywiście normalnym kodem C ++. Gwarancje stosowane w kodzie wynikają bezpośrednio z nowych gwarancji w ramach lokowania. To jestrdzeń standardu, to solidna rzecz. Jak można go nazwać „brudnym” i przedstawić jako coś niewiarygodnego?

Czy sądzisz, że możliwe jest, że wdrażanie nowych i niestosowanie nowych jest inne? Zastanawiam się nad jakąś chorą możliwością, że zwykły nowy może na przykład umieścić rozmiar bloku pamięci przydzielonego przed blokiem, którego nowe miejsce oczywiście nie zrobiłoby (ponieważ nie przydziela żadnej pamięci). Może to spowodować lukę w niektórych problemach ...Czy taka nowa () implementacja jest możliwa?

questionAnswers(10)

yourAnswerToTheQuestion