Zaawansowana alokacja pamięci w C++

Opublikowane: 30/11/2014

w kategorii Zasoby.

Jest kilka powodów dla których możesz chcieć użyć innych niż domyślna strategii alokacji pamięci.

Niektóre z nich:

  • potrzebujesz zaalokować dużą liczbę obiektór o równym rozmiarze
  • potrzebujesz szybkie zwalnianie pamięci
  • obchodzi Cię fragmentacja pamięci (w grze konsolowej lub systemie wbudowanym)

Specjalne konstruowanie obiektów

Czasami potrzebujesz wykonać alokację obiektu w specjalny sposób, tutaj krótka lista która wspomina specjalną składnię dla operatora "new":

nothrow: wykonanie "new" bez obsługi wyjątków

Zwykle w przypadku braku pamięci biblioteka standardowa generuje wyjątek std::bad_alloc. Jeśli zamiast tego chcesz wykorzystać swoją własną logikę warunkową, możesz użyć składni "nothrow":

MyClass *p;
p = new (std::nothrow) MyClass;
if (!p) {
  cout << "Alokacja się nie powiodła!\n";  
}

alokacja tablicy obiektów bez wywoływania konstruktora

W standardowych sytuacjach kiedy dynamicznie alokujesz tablicę obiektów wykorzystujesz składnię:

const size_t ARRAY_SIZE = 123;
MyClass *ptr = new MyClass[ARRAY_SIZE];

W takim przypadku dla każdego obiektu w tablicy wywoła się domyślny konstruktor. Jeśli zamiast tego chcesz wywołać konstruktor z jakimiś parametrami ale nie chcesz użyć malloc, możesz zaalokować tablicę używając globalnego operatora "new":

const size_t ARRAY_SIZE = 123;
MyClass *ptr = static_cast<MyClass *>(operator new[](sizeof(MyClass) * ARRAY_SIZE));

Teraz aby wywołać wybrany konstruktor na już zaalokowanej pamięci, musisz użyć konstruktora "w miejscu" dla każdego elementu tablicy - zobacz poniżej.

placement new - wywołaj konstruktor dla zaalokowanego obiektu

Jeśli musisz wywołać konstruktor dla obiektu który ma już zaalokowaną pamięć, używasz składni "placement new". Może to być użyteczne w wyspecjalizowanych alokatorach "arena" lub pulach obiektów.

const size_t ARRAY_SIZE = 123;
MyClass *ptr = static_cast<MyClass *>(operator new[](sizeof(MyClass) * ARRAY_SIZE));

size_t i = ARRAY_SIZE;
while (i-- > 0) { 
  // --> placement new, wywołuje konstruktor dla zaalokowanego obiektu wskazywanego przez ptr[i] z przykładowymi argumentami
  new (ptr[i]) MyClass(12, 'a', "test"); 
  // <-- 
}

Wyspecjalizowane rozwiązania dla alokacji

Zastępniki malloc

Garbage collection w C++

Zobacz również

Udostępnij

obserwuj