malloc
Функция возвращает кусок смежной памяти, вот и все. То, как вы набираете текст и используете его (для ваших объектов), является вашей проблемой.
В то время как оператор new
возвращает объекты, выделенные в память. Хотя оба возвращают указатель, в конце вы получаете построенные объекты, а не необработанную память в C++. Здесь фокус переходит от низкоуровневой обработки памяти к обработке объектов, с которой возникает безопасность типа. Вот почему new
не возвращает void*
.
Кроме того, если вы заметили, что в первом случае C это функция, которая выполняет выделение, то есть сам язык не имеет понятия выделения объектов или памяти. В то время как в C++ new
является оператором, и, следовательно, язык по сути понимает, что означает динамическое создание объектов. Компилятор реализует то, что задает язык, и, таким образом, он может помечать ошибку при ее обнаружении.
Примером может быть:
int *ptr = malloc(sizeof(char) * 4);
Здесь программист принимает целое число имеет размер , в то время как это может быть правдой в своей платформе, это, безусловно, не верно для всех платформ. Также концептуально char
и int
- это разные типы, но несоответствие типов игнорируется компилятором C. Все, что он делает, вызывает функцию malloc
и присваивает адрес, который он возвращает, ptr
. Это домен заканчивается там, программисту нужно использовать (или злоупотреблять?) Выделенную память. Это не ошибка или слабость в части компилятора, поскольку языковой стандарт не дает больше полномочий компилятору для обеспечения большего количества.
В то время как в C++
int *ptr = new char[4];
будет помечен как ошибка; правильный способ сделать это будет int *ptr = new int;
, где типы совпадают. C++ более строг, позволяя меньшую свободу в местах, где ошибки являются общими, там, приводя к более чистым кодам. Тип безопасности, возможно, является самой большой функцией безопасности на языке C++.Тип casting имеет уродливый синтаксис по той же причине: они показывают слабые стороны дизайна. С более строгим языком компилятор может обеспечить дополнительные ограничения для разработчика (поскольку люди более подвержены ошибкам, в большинстве случаев это хорошо работает).
Следует отметить, что malloc() и free() не являются «предпочтительным» способом выделения памяти на C++. Они в основном предназначены для простой поддержки C. C++ вы обычно используете новые и удаляете. – seand