Как работает new

`new` используется для динамического выделения памяти на куче. Он не только выделяет память, но и инициализирует объекты, что отличает его от функции `malloc()`, которая только выделяет память без инициализации объектов.

Как он работает

1. Выделение памяти: Запрашивает у операционной системы достаточное количество памяти для хранения объекта или массива объектов указанного типа. В отличие от `malloc`, `new` автоматически вычисляет размер памяти, необходимый для объекта типа, который вы хотите создать.

2. Конструирование объекта: После выделения памяти `new` вызывает конструктор объекта (если это пользовательский тип), чтобы правильно его инициализировать. Это включает в себя инициализацию всех членов объекта согласно определению конструктора.

3. Возвращение указателя: После создания объекта он возвращает указатель на него. В случае неудачи (например, если память не может быть выделена), оператор `new` бросает исключение `std::bad_alloc`, в отличие от `malloc`, который просто возвращает `nullptr`.

Пример:

```cpp
#include <iostream>

class Sample {
public:
    Sample() { std::cout << "Конструктор вызван\n"; }
    ~Sample() { std::cout << "Деструктор вызван\n"; }
};

int main() {
    try {
        Sample* mySample = new Sample();  // Выделение памяти и инициализация объекта
        delete mySample;  // Освобождение памяти и вызов деструктора
    } catch (const std::bad_alloc& e) {
        std::cerr << "Ошибка выделения памяти: " << e.what() << '\n';
    }
    return 0;
}
```
  • `new` и `delete` являются операторами в C++, тогда как `malloc` и `free` являются функциями в C.
  • Всегда используйте `delete` для освобождения памяти, выделенной с помощью `new`, и `delete[]` для освобождения памяти, выделенной для массивов с помощью `new[]`.
  • `new[]` и `delete[]` используются для создания и уничтожения массивов объектов. `new[]` вызывает конструктор для каждого элемента массива, а `delete[]` вызывает деструктор для каждого элемента.

`new` является мощным инструментом в C++ для динамического выделения памяти, который обеспечивает не только выделение памяти, но и должную инициализацию объектов. Это помогает обеспечить безопасность типов и автоматическую инициализацию, делая код более безопасным и предсказуемым по сравнению с простым выделением памяти через `malloc`.

April 20, 2024, easyoffer