Другие языки программирования и технологии
Вопрос для людей, знающих С/С++ -динамическое выделение памяти
Чем отличается malloc и new ? Обязательно ли в конце писать free( )/delete[ ] ? Когда именно это нужно писать и зачем? Спасибо.
malloc() - функция, ей нужно указывать объем выделяемой памяти
new - операция, ей не нужно ничего указывать, сама подсчитает. есть только в с++, в чистом си такой операции нет
освобождение памяти писать нужно обязательно, потому что автоматически выделенная динамическая память не освобождается. если ее не освобождать, в один неприятный момент обнаружится, что свободной памяти нет, или, еще того хуже, будет задействована совершенно не приспособленная для ваших хозяйственных нужд область памяти, например видеопамять. когда писать? когда ваша динамическая переменная вам больше не нужна
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, как утверждает один из предыдущих постеров, весьма сомнителен. А различий, кроме удобства, - целый вагон и маленькая тележка.
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 соответственно - да, обязательно. Ну т. е. технически ты можешь и не освобождать память, но тогда у тебя будут т. н. утечки памяти, и вообще программа можешь начать жрать всю оперативку.
Зачем и когда - почитай свой учебник. Уверен уж это там написано.
new - оператор С++, внутри себя использует тот же malloc.
Разница в удобстве использования, но в результате - разницы никакой.
free и delete соответственно - да, обязательно. Ну т. е. технически ты можешь и не освобождать память, но тогда у тебя будут т. н. утечки памяти, и вообще программа можешь начать жрать всю оперативку.
Зачем и когда - почитай свой учебник. Уверен уж это там написано.
Похожие вопросы
- Язык си, не могу понять динамическое выделение памяти.
- Помогите с решением задач по С по теме "Динамическое выделение памяти"!
- Выделение памяти в C
- Выделение памяти и обращение к элементам C++
- Напишите пожалуйста примеры функций выделения памяти и освобождения памяти (с аргументами) в С++ ?
- пожалуйста, напишите мне программу этого вопроса в C ++.пожалуйста помогите. Создать динамический массив из N чисел.
- Вау, у меня есть вопрос =D . Часть знаю как решить а часть нет. Тогда задам подвопрос. Язык - C# C++ Pascal на выбор
- есть вопрос,я хочу знать, ести ли программа, для построения трёхмерного изображения
- Вопрос тем, кто знает Pascal! Как сделать так, чтобы результат программы, который выводится на экран,
- Вопрос программистам которые знают хотя бы один язык программирования.
а вот что еще важного в new - это при выделении
памяти для экземпляра класса автоматически вызывается
конструктор, а при освобождении деструктор (что это и зачем
узнаете сами)