ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 10) онлайн

Операция new

С++ предлагает другой подход к выделению памяти: операцию new: Это универ- сальная операция, получающая память у операционной системы и возвраща- ющая указатель на начало выделенного блока. В программе NEWINTRO показано, как это работает:

// newintro.cpp

// познакомимся с оператором new

#include <iostream>

#include <cstring>

using namespace std;

 

int main ( )

{

  char* str = "Дурная голова ногам покоя не дает.";

  int len = strlen ( str );        // вычислим длину нашей строки

  char* ptr;                       // определим переменную

  ptr = new char [ len +1 ];       // выделим память

  strcpy ( ptr, str );             // скопируем строку str в ptr

  cout << "ptr = " << ptr << endl; // покажем что содержится в ptr

  delete [] ptr;                   // освободим выделенную память

  return 0;

}

 

Выражение

ptr = new char [ len + 1 ];

присваивает переменной ptr значение адреса блока памяти, достаточного для хра- нения строки str, длину которой можно получить, используя библиотечную функ- цию strlen() плюс дополнительный байт для символа конца строки. На рис. 10.13 показан синтаксис операции new. Обратите внимание на использование квадрат- ных скобок. На рис. 10.14 показана память, выделенная с помощью операции new, и указатель на нее.

В примере NEWINTRO мы использовали функцию strcpy() для копирования строки str в выделенный участок памяти, на который указывает указатель ptr. Строка полностью займет этот участок памяти, так как его размер равен длине строки str. Результат работы программы NEWINTRO будет следующим:

ptr - Дурная голова ногам покоя не дает.

Рис. 10.14. Память, выделенная с помощью операции new

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

Программистам, использующим C, может быть интересно, существует ли в C++ функция для изменения размера памяти, которая была уже перераспре- делена, эквивалентная функции realloc(). К сожалению, операции renew в языке С++ не существует. Вам придется пойти на хитрость, выделить с помощью опе- рации new большее или меньшее количество памяти, а затем скопировать ваши данные в новый блок памяти.

 

25