есть ли различие между массивами malloced и массивами newed

Я обычно программирую в C++, но использую некоторые функции clibrary для своего char*. Некоторые страницы справочника как для 'getline', говорит, что вход должен быть массивом malloced.

Это в порядке, для использования 'новый' вместо этого?

Я вижу для своей небольшой выборки, что она работает, но это могло в какой-то момент привести к некоторому странному неопределенному поведению?

Я знаю, что 'новое' должно соответствовать 'удалению' и 'malloc' со 'свободным'.

Я также не использую станд.:: строка. И это является намеренным.

Спасибо

5
задан Prasoon Saurav 28 December 2009 в 04:21
поделиться

3 ответа

Буфер, переданный для getline() ДОЛЖЕН быть обработан молотком. Причина в том, что getline() может вызывать realloc() на буфере, если требуется больше места.

realloc(), как и free(), следует использовать только с памятью, выделенной функцией malloc(). Это связано с тем, что malloc() и new allocation memory from different storage areas:

See: В чем разница между new/delete и malloc/free?

В принципе, новый использует "The Free Store", в то время как malloc использует "The Heap". Обе эти области являются частью "кучи приложений" (хотя стандарт на самом деле не требует "кучи приложений", поскольку это детальная реализация). Хотя они оба находятся в "куче приложений", эти области не обязательно должны пересекаться. Так ли это - подробность реализации.

man page for getline():

Обратите внимание на эту строку:

В качестве альтернативы, перед вызовом getline(), *lineptr может содержать указатель на malloc()-распределенный буфер *n байт по размеру. Если буфер недостаточно велик для хранения строки, getline() изменяет его размер функцией realloc(), обновляя *lineptr и *n по мере необходимости.

13
ответ дан 18 December 2019 в 10:45
поделиться

Для этого вполне нормально иметь массив 'new' ed вместо массива 'malloc' ed.

Разница между ними в том, что (чтобы перечислить некоторые из них) :

  • new/delete в отличие от malloc/free называют конструктор/деструктор ассоциируемого объекта. Последний не может выполнять инициализацию/деинициализацию.
  • new возвращает указатель нужного типа, но указатель, который возвращает malloc, должен быть типизирован (C++)
  • new/delete не имеет альтернативы realloc в отличие от new/delete

Эти вещи не будут иметь большого значения в вашей программе; поэтому, как было сказано выше, совершенно нормально пойти на 'new'

Ваш код не подведет, если только новый или malloc не подведет, и в этом случае 'new' бросает исключение, а malloc возвращает NULL указатель.

EDIT: Для этого массив должен быть 'malloc' ed. Наверное, тогда я ошибался! Спасибо, Мартин! :)

1
ответ дан 18 December 2019 в 10:45
поделиться

Да, можно использовать указатель, выделенный с new, когда ожидается "молотый".

Кстати, getline - это не ISO C. В стандартной библиотеке С++ есть getline, но он ожидает std::string. Для стандартного чтения файлов на Си следует использовать fgets. Это работает (упрощенный код, предполагающий наличие в файле и не проверяет возвращаемое значение fgets - что, вероятно, должно быть в реальном коде):

// infile is some open FILE* object
int mylen = 100;
char* line = new char[mylen];
fgets(line, mylen, infile)

Однако, обязательный отказ от ответственности: гораздо лучше использовать std::string и getline, если Вы используете C++.

.
2
ответ дан 18 December 2019 в 10:45
поделиться