Форум программистов, компьютерный форум CyberForum.ru

Чем new отличается от malloc? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Нужно написать программу нахождения скачка потенциала. (Есть алгоритм) http://www.cyberforum.ru/cpp-beginners/thread895479.html
Дан U - массив оцифрованного потенциала. Дано еще U пороговое. Найти скачек и вернуть время скачка. 1. Вводим то, что дано. Это понятно. - dt - шаг табуляции U(t) или шаг квантования, - n - размерность массива U(), - Uпорог - порог компаратора, 2. Зануляем начальные условия - i - счетчик цикла, - к - переменная, в которой накапливается количество точек U(t) выше Uпорог,
C++ Нюансы выделения и освобождения памяти (структуры) struct point { int a; point *next; } point *p=new point Я освобожу всю память которая отводилась под динам. структуру? delete p; http://www.cyberforum.ru/cpp-beginners/thread895461.html
Описать структуру с именем NOTE C++
Вот в чем проблема, у меня есть код примера задачи, условие которого: 1. Описать структуру с именем NOTE, содержащую следующее поля: *фамилия,имя; *номер телефона; *день рождения(число, месяц - массив из 3-х чисел). 2. Написать программу, выполняющую следующие действия: * Вввод с клавиатуры данных в массив, состоящий из девяти структур типа NOTE; * вывод данных на экран записи должны...
C++ Указатель на ф-цию в структуре
Привет всем, почему если объявить структуру в виде указателя и присвоить указателю на ф-цию функцию, то будет ошибка, а если объявить структуру не как указатель, то работает всё нормально. Пишу так: struct Route{ void (*start)(char *); } * route; int main(){ route -> start = test; //Ошибка сегментирование при запуске программы route.start = test; //Работает нормально
C++ Протабулировать функцию http://www.cyberforum.ru/cpp-beginners/thread895447.html
Функция: f(x,y)={x}^{3}+\sqrt{y} x\in (-2;2) y\in (0;3.5) с шагом 0,35
C++ Множества Из множества M точек на плоскости, заданных декартовыми координатами, сформировать подмножество P\leq M, содержащее точки, которые находятся внутри замкнутой точки D. Область D ограничена линиями, уравнения которых y=0,2*x-{k}_{1}; {k}_{{i}_{1}}=0,1, \Delta {k}_{i}=0,1 , {k}_{{i}_{2}}=0,5. y={k}_{2}*\cos (x+0,25); {k}_{{i}_{1}}=1,0 , \Delta {k}_{i}=0,4,{k}_{{i}_{2}}=2,2.... подробнее

Показать сообщение отдельно
Гром
 Аватар для Гром
199 / 118 / 10
Регистрация: 20.03.2009
Сообщений: 1,075
Записей в блоге: 15
08.06.2013, 17:40     Чем new отличается от malloc?
malloc просто выделяет нужное количество памяти. Непосредственно после выполнения строки
C++
1
some_type* p = (some_type*)malloc(sizeof(some_type));
по указателю p находится мусор. Достоверно известно только что он указывает на область памяти нужного размера, на которую больше никто не претендует. После этого через этот указатель с данной областью памяти можно будет делать полезные вещи, т.к. тип указателя дает компилятору информацию, как с этой памятью работать.
Но можно компилятор и обмануть, сказав ему
C++
1
some_type* p = (some_type*)malloc(sizeof(another_type));
Тогда malloc честно выделит область памяти размера типа another_type и передаст указатель на нее. Но мы-то присваиваем адрес этой области памяти указателю some_type. И теперь компилятор будет работать с ней как с областью памяти, выделенной под совсем другое.

В то же время new мало того, что возвращает указатель именно на тот тип, который мы ему указали, так он еще и вызывает конструктор для этого типа. Так что на выходе мы имеем не сырую память подходящего размера, а полноценно сконструированный объект нужного типа (при условии, что подходящий конструктор работает как надо), и нам не нужно прямо здесь же вручную инициализировать эту область памяти нужными значениями. Кроме того, в случае неудачи new вызовет исключение bad_alloc, а не вернет указатель черт знает на что.
 
Текущее время: 11:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru