Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

pp–>p = "pear"; /* инициализировать */

pp–>val = 42;

Теперь мы не можем написать инструкцию

*pp = {"pear", 42}; /* ошибка: не C и не C++98 */

ни в программе на языке C, ни в программе на языке C++. Однако в языке С++ мы могли бы определить конструктор для структуры

Pair
и написать инструкцию
Pair* pp = new Pair("pear", 42)
;

В языке C (но не в языке C++; см. раздел 27.3.4) перед вызовом функции malloc можно не указывать приведение типа, но мы не рекомендуем это делать.

int* p = malloc(sizeof(int)*n); /* избегайте этого */

Игнорирование приведения довольно часто встречается в программах, потому что это экономит время и позволяет выявить редкую ошибку, когда программист забывает включить в текст программы заголовочный файл

<stdlib.h>
перед использованием функции
malloc
. Однако при этом исчезает и визуальный маркер, свидетельствующий о том, что размер памяти подсчитан неправильно.

p = malloc(sizeof(char)*m); /* вероятно, ошибка — нет места для m целых */

Не используйте функции
malloc/free
в программах, написанных на языке C++; операторы
new/delete
не требуют приведения типа, выполняют инициализацию (вызывая конструкторы) и очищают память (вызывая деструкторы), сообщают об ошибках, связанных с распределением памяти (с помощью исключений), и просто работают быстрее. Не удаляйте объект, размещенный в памяти с помощью функции
malloc
, выполняя оператор
delete
, и не удаляйте объект, созданный с помощью оператора new, вызывая функцию
free
. Рассмотрим пример.

int* p = new int[200];

// ...

free(p); // ошибка

X* q = (X*)malloc(n*sizeof(X));

// ...

delete q; // error

Этот код может оказаться вполне работоспособным, но он не является переносимым. Более того, для объектов, имеющих конструкторы и деструкторы, смешение стилей языков C и C++ при управлении свободной памятью может привести к катастрофе. Для расширения буферов обычно используется функция

realloc
.

int max = 1000;

int count = 0;

int c;

char* p = (char*)malloc(max);

while ((c=getchar)!=EOF) { /* чтение: игнорируются символы

в конце файла */

if (count==max–1) { /* необходимо расширить буфер */

max += max; /* удвоить размер буфера */

p = (char*)realloc(p,max);

if (p==0) quit;

}

p[count++] = c;

}

Объяснения операторов ввода в языке С приведены в разделах 27.6.2 и Б.10.2.

Функция
realloc
может выделить память на прежнем участке, а может и перенести его содержимое во вновь выделенную область памяти. Даже не думайте применять функцию
realloc
к области памяти, выделенной с помощью оператора
new
.

Используя стандартную библиотеку языка C++, этот код можно переписать примерно так:

vector<char> buf;

char c;

while (cin.get(c)) buf.push_back(c);

Более подробное обсуждение стратегий ввода и распределения памяти можно найти в статье “Learning Standard C++ as a New Language” (см. список библиографических ссылок в конце раздела 27.1).

27.5. Строки в стиле языка С

Строка в языке C (в литературе, посвященной языку С++, ее часто называют С-строкой (C-string), или строкой в стиле языка С (C-style)) — это массив символов, завершающийся нулем. Рассмотрим пример.

char* p = "asdf";

char s[ ] = "asdf";

В языке C нет функций-членов, невозможно перегружать функции и нельзя определить оператор (такой как

==
) для структур. Вследствие этого для манипулирования строками в стиле языка С необходим набор специальных функций (не членов класса). В стандартных библиотеках языков C и C++ такие функции определены в заголовочном файле
<string.h>
.

  • Читать дальше
  • 1
  • ...
  • 449
  • 450
  • 451
  • 452
  • 453
  • 454
  • 455
  • 456
  • 457
  • 458
  • 459
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: