Я обычно программирую в C++, но использую некоторые функции clibrary для своего char*. Некоторые страницы справочника как для 'getline', говорит, что вход должен быть массивом malloced.
Это в порядке, для использования 'новый' вместо этого?
Я вижу для своей небольшой выборки, что она работает, но это могло в какой-то момент привести к некоторому странному неопределенному поведению?
Я знаю, что 'новое' должно соответствовать 'удалению' и 'malloc' со 'свободным'.
Я также не использую станд.:: строка. И это является намеренным.
Спасибо
Буфер, переданный для 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 по мере необходимости.
Для этого вполне нормально иметь массив 'new' ed вместо массива 'malloc' ed.
Разница между ними в том, что (чтобы перечислить некоторые из них) :
Эти вещи не будут иметь большого значения в вашей программе; поэтому, как было сказано выше, совершенно нормально пойти на 'new'
Ваш код не подведет, если только новый или malloc не подведет, и в этом случае 'new' бросает исключение, а malloc возвращает NULL указатель.
EDIT: Для этого массив должен быть 'malloc' ed. Наверное, тогда я ошибался! Спасибо, Мартин! :)
Да, можно использовать указатель, выделенный с 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++.