Как работает 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