Co to jest in-place constructor w C++? [duplikat]

to pytanie ma już odpowiedzi tutaj : Zamknięte 10 lat temu .

Możliwy duplikat:
C++'S "placement new"

Czym jest konstruktor in-place W C++?

Np. Datatype *x = new(y) Datatype();

Author: peterh - Reinstate Monica, 2010-09-21

6 answers

Nazywa się to operatorem nowego lokowania. Pozwala na dostarczenie pamięci, do której zostaną przydzielone dane, bez konieczności przydzielania jej przez operatora new. Na przykład:

Foo * f = new Foo();

Powyższe przydzieli Ci pamięć.

void * fm = malloc(sizeof(Foo));
Foo *f = new (fm) Foo(); 

Powyższe użyje pamięci przydzielonej przez wywołanie do malloc. new nie przydziela więcej. Nie jesteś jednak ograniczony do zajęć. Możesz użyć nowego operatora dla dowolnego typu, który przydzielisz z połączeniem do new.

A 'gotcha' for placement new polega na tym, że nie należy zwalniać pamięci przydzielonej przez wywołanie do operatora placement new używając słowa kluczowego delete. Zniszczysz obiekt, wywołując Destruktor bezpośrednio.

f->~Foo();

Po ręcznym wywołaniu destruktora, pamięć może zostać uwolniona zgodnie z oczekiwaniami.

free(fm);
 45
Author: linuxuser27,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-04 22:32:12

Krótka odpowiedź jest taka, że Twój kod konstruuje obiekt w przestrzeni wskazywanej przez y. Długa odpowiedź jest najlepiej opisana w C++ FAQ .

 7
Author: Michael Kristofik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-21 19:47:38

Jest to bardziej znane jako 'umieszczenie nowego' i jest dość dobrze omówione przez C++ FAQ (w obszarze' destruktory'):

Pozwala na konstruowanie obiektów w surowej pamięci, co może być przydatne w pewnych specjalistycznych sytuacjach, na przykład, gdy możesz chcieć przydzielić tablicę dla dużej liczby możliwych obiektów, ale chcesz konstruować następnie w razie potrzeby, ponieważ często możesz nie potrzebować wszędzie blisko maksimum lub dlatego, że chcesz lub musisz użyć niestandardowego alokatora pamięci.

 4
Author: Michael Burr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-21 19:48:34

Jestem zardzewiały na ten jeden, ale to pozwala na zapisanie obiektu do bloku pamięci już przydzielone. Wymaga również wzajemnego polecenia delete, aby wyczyścić go z pamięci.

 2
Author: wheaties,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-21 19:46:31

Jeśli używasz puli pamięci, musisz użyć konstruktora in place, aby zainicjować swój obiekt, ponieważ są one przydzielane z puli.

 2
Author: stonemetal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-21 19:46:48

To sposób na wywołanie konstruktora bez przydzielania pamięci. Twój y musi być wskaźnikiem do wystarczającej ilości pamięci dla nowego obiektu Datatype. Ponadto, nie dzwoń delete, dzwoń ~DataType().

 1
Author: Fozi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-21 19:47:21