2009-04-30 4 views
1

Дубликат: In what cases do I use malloc vs new?Когда использовать таНос вместо New

Просто перечитывая этот вопрос:
What is the difference between "new" and "malloc" and "calloc" in C++?

я проверил ответы, но никто не ответил на вопрос:

  • Когда бы Я использую malloc вместо new?

Существует несколько причин (я могу думать о двух).
Пусть лучший поплавок на вершине.

+0

См. Ответы на http://stackoverflow.com/questions/240212/what-is-the-difference-between-new-delete-and-malloc-free –

+0

@dana - это не относится к текущему вопросу , – 2009-04-30 20:30:46

ответ

12

Пара, что весной на ум:

  • Когда вам нужны коды, чтобы быть переносимыми между C++ и C.
  • При распределении памяти в библиотеке, которая может вызываться из C, и C код должен освободить выделение.
+0

Это задает вопрос. Зачем избегать этого в C++, но не в C? Конечно, очевидный ответ заключается в том, что у нас есть ключевое слово «новое». Теперь мы в начале: зачем использовать new вместо malloc? Это не отвечает на вопрос. –

+0

@DonLarynx "зачем использовать новый вместо malloc?" Потому что он вызывает конструкторы, когда это необходимо, для одного. – emlai

0

Программист на C++ редко должен когда-либо требовать вызова malloc. Единственная причина, по которой я могу думать, - это плохо построенный API, который ожидал, что вы перейдете в память malloc'd, потому что это будет делать бесплатно. В вашем собственном коде новый всегда должен быть равным malloc.

1

Лучшая причина, по которой я могу придумать использование malloc в C++, - это взаимодействие с чистым C API. Некоторые API-интерфейсы C, с которыми я работал, берут на себя ответственность за память определенных параметров. Как таковые они отвечают за освобождение памяти, и, следовательно, память должна быть бесплатной через свободный. Маллок будет работать на этот пуповин, но не обязательно новый.

1

Одна из причин того, что в C++ вы можете перегрузить новый оператор.

Если вы хотите, чтобы в вашем коде использовалось распределение памяти системной библиотеки, вы можете использовать malloc.

+0

Вы также можете позвонить: new, не так ли? –

+0

Вы никогда не можете * действительно быть уверенным (например, вы могли предварительно загрузить свой libc, чтобы позвонить вам malloc/free), и вы не должны писать код, который должен заботиться. –

+0

Не говоря уже о том, что вы можете переопределить глобальное новое. –

0

Если память должна быть освобождена свободным() (в вашем или каком-либо кодексе elses), для использования malloc достаточно использовать darn.

В противном случае я не уверен. Один надуманный случай - это когда вы не хотите, чтобы деструктор (ы) запускался при выходе, но в этом случае вы, вероятно, должны иметь объекты, у которых нет-op dtor в любом случае.

2

В C++, почти никогда. new обычно является оберткой вокруг malloc, которая вызывает конструкторы (если применимо.)

Однако, по крайней мере, с Visual C++ 2005 или выше, using malloc can actually result in security vulnerabilities over new.

Рассмотрим этот код:

MyStruct* p = new MyStruct[count]; 
MyStruct* p = (MyStruct*)malloc(count* sizeof(MyStruct)); 

Они выглядят equivelent. Тем не менее, codegen для первого фактически проверяет целочисленное переполнение в count * sizeof(MyStruct).. Если счет исходит из ненастроенного источника, это может вызвать переполнение целого числа, в результате чего выделяется небольшой объем памяти, но затем, когда вы используете счет, вы переполняете буфер.

+2

Если вы не проводите проверку работоспособности по счету, полученному из ненадежного источника, у вас есть уязвимость системы безопасности, независимо от того, используете ли вы malloc или new. –

+0

Это еще один уровень защиты, он определенно не позволяет слепо доверять данным. – Michael

+0

Второй пример должен использовать calloc в C, он выполнит проверку переполнения: MyStruct * p = calloc (count, sizeof (MyStruct)); – user83255

4

С Страуструпом FAQ по new/malloc я отправил на эту тему:

Всякий раз, когда вы используете таНос() вы должны рассмотреть инициализацию и Перекодировку указателя возврата к соответствующему типу. Вам также придется подумать, есть ли у вас количество байтов для вашего использования. При включении инициализации разница производительности между malloc() и новшеством отсутствует.

Это должно ответить на ваш вопрос.

+0

Если честно, я не вижу, как. – 2009-04-30 20:28:00

0

Вы можете использовать malloc, если вы не хотите беспокоиться о том, чтобы ловить исключения (или использовать неметающую версию нового).

2

Все упомянули (используя несколько разные слова) при использовании библиотеки C, которая будет использовать free(), и их много.

Другая ситуация, которую я вижу:

Когда Вайтинг собственного управления памятью (потому что по какой-то причине, что вы открыли для себя путем моделирования по умолчанию не достаточно хорошо). Вы можете выделить блок памяти с помощью malloc и инициализировать объекты в пулах с помощью размещения new.

+0

Почему бы не выделить необработанную память новым? – 2009-04-30 18:17:50

+1

void * buffer = new char [100000]; совершенно легально C++ – 2009-04-30 20:40:50

+0

Если вам нужна необработанная память, эквивалент malloc будет новым оператором, например. void * buffer = :: operator new (100000); Хотя char являются базовыми типами, поэтому не делайте ничего опасного при построении или уничтожении, семантически более понятно использовать новый оператор, чем использовать объект char char, а затем повторно использовать его базовое хранилище для другого набора объектов. –