Co to jest in-place constructor w C++? [duplikat]
Możliwy duplikat:
C++'S "placement new"
Czym jest konstruktor in-place W C++?
Np. Datatype *x = new(y) Datatype();
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);
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 .
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.
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.
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.
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()
.
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