Другие языки программирования и технологии

Вопрос для людей, знающих С/С++ -динамическое выделение памяти

Чем отличается malloc и new ? Обязательно ли в конце писать free( )/delete[ ] ? Когда именно это нужно писать и зачем? Спасибо.
Ashot Gevorkyan
Ashot Gevorkyan
908
malloc() - функция, ей нужно указывать объем выделяемой памяти
new - операция, ей не нужно ничего указывать, сама подсчитает. есть только в с++, в чистом си такой операции нет
освобождение памяти писать нужно обязательно, потому что автоматически выделенная динамическая память не освобождается. если ее не освобождать, в один неприятный момент обнаружится, что свободной памяти нет, или, еще того хуже, будет задействована совершенно не приспособленная для ваших хозяйственных нужд область памяти, например видеопамять. когда писать? когда ваша динамическая переменная вам больше не нужна
Алексей Давыдов
Алексей Давыдов
19 025
Лучший ответ
Farail Humbatov с видеопамятью вы малость перегибаете палку,
а вот что еще важного в new - это при выделении
памяти для экземпляра класса автоматически вызывается
конструктор, а при освобождении деструктор (что это и зачем
узнаете сами)
CИ : malloc(количество байт) ; выделяет количество байт, возвращает указатель void*, нужно приводить к желаемому типу
int *p = (int *)malloc(20*sizeof(int)); // массив int[20];
free(p);// освобождает память

C++
new CLASS( можно указать параметры конструктора) ; // ,выделяет количество байт=sizeof(CLASS), вызывает конструктор класса при наличии такового, возвращает указатель CLASS*, создание одного объекта класса

class MyClass
{
public:
MyClass();
MyClass (int t);
~MyClass();
};

MyClass *p = new MyClass(120); // один объект с параметром конструктора 120
delete p; // вызывает деструктор класса при наличии такового, освобождает память

new CLASS[количество объектов] ; // ,выделяет количество байт=sizeof(CLASS)*количество объектов, вызывает конструктор класса без параметров при наличии такового для каждого объекта, возвращает указатель CLASS*, создание массива объектов класса

MyClass *p = new MyClass[12]; // массив из 12 объектов
delete [ ] p; // вызывает деструктор класса при наличии такового для каждого объекта массива, освобождает память

Для удаление одного объекта просто delete
Для удаление массива объектов delete [ ]

операторы new, new[], delete, delete[] можно переопределить для разрабатываемого класса. Тот факт, что new внутри себя использует malloc, как утверждает один из предыдущих постеров, весьма сомнителен. А различий, кроме удобства, - целый вагон и маленькая тележка.
malloc - функция С.
new - оператор С++, внутри себя использует тот же malloc.
Разница в удобстве использования, но в результате - разницы никакой.

free и delete соответственно - да, обязательно. Ну т. е. технически ты можешь и не освобождать память, но тогда у тебя будут т. н. утечки памяти, и вообще программа можешь начать жрать всю оперативку.
Зачем и когда - почитай свой учебник. Уверен уж это там написано.
Сурен Оганезов
Сурен Оганезов
11 177