New (C++)

New (C++)

new (C++)


В языке программирования C++, new — оператор, обеспечивающий выделение динамической памяти в куче. За исключением формы, называемой «размещающей формой new», new пытается выделить достаточно памяти в куче для размещения новых данных и, в случае успеха, возвращает адрес свежевыделенной памяти. Однако, если new не может выделить память в куче, то он передаст (throw) исключение типа std::bad_alloc. Это устраняет необходимость явной проверки результата выделения.

Содержание

Синтаксис

Синтаксис new выглядит следующим образом:

p_var = new typename;

где p_var — ранее объявленный указатель типа typename. typename может подразумевать собой любой фундаментальный тип данных или объект, определенный пользователем (включая, enum, class и struct). Если typename — это тип класса, то вызывается конструктор по умолчанию для создания объекта.

Для инициализации новой переменной, созданной при помощи new нужно использовать следующий синтаксис:

p_var = new type(initializer);

где initializer — первоначальное значение, присвоенное новой переменной, а если type — тип класса, то initializer — аргумент(ы) конструктора.

new может также создавать массив:

p_var = new type [size];

В данном случае, size указывает размерность (длину) создаваемого одномерного массива. Адрес первого элемента возвращается и помещается в p_var, поэтому

p_var[n]

означает значение n-го элемента (считая от нулевой позиции)

Память, выделенная при помощи new, должна быть освобождена при помощи delete, дабы избежать утечки памяти. Массивы, выделенные (созданные) при помощи new[], должны освобождаться (уничтожаться) при помощи delete[].

int *p_scalar = new int(5);
int *p_array = new int[5];

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

Placement new

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

Реализация

В компиляторах, придерживающимся стандарта ISO C++, в случае если недостаточно памяти для выделения, то код передает исключение типа std::bad_alloc. Выполнение всего последующего кода прекращается, пока ошибка не будет обработана в блоке try-catch или произойдет экстренное завершение программы. Программа не нуждается в проверке значения указателя; если не было передано исключение, то выделение прошло успешно. Реализованные операции определяются в заголовке <new>. В большинстве реализаций C++ оператор new также может быть перегружен для определения особого поведения.

Освобождение динамически выделенной памяти

Любая динамически выделенная память при помощи new должна освобождаться при помощи команды delete. Существует два варианта: один для массивов, другой — для единичных объектов.

int *p_var = new int;
int *p_array = new int[50];
 
delete[] p_array;
delete p_var;

Необходимо отметить, что компилятор не требует создания диагностического сообщения при некорректном использовании delete; он в общем случае не может знать, когда указатель указывает на одиночный элемент, а когда — на массив элементов. Более того, использование не соответствующего освобождения по сути вызывает неопределённое поведение.

Повторное выделение памяти, выделенной при помощи new[]

В отличие от оператора realloc в языке Си, при помощи new[] невозможно напрямую перераспределить уже выделенную память. Для увеличения или уменьшения размера блока памяти нужно выделить новый блок нужного размера, скопировать данные из старой памяти и удалить старый блок. Стандартная библиотека языка C++ предусматривает поддержку динамического массива, который может быть увеличен или уменьшен в своем шаблонном классе .

См. также


Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Нужно решить контрольную?

Полезное


Смотреть что такое "New (C++)" в других словарях:

  • New — (n[=u]), a. [Compar. {Newer} (n[=u] [ e]r); superl. {Newest}.] [OE. OE. newe, AS. niwe, neowe; akin to D. nieuw, OS. niwi, OHG. niuwi, G. neu, Icel. n[=y]r, Dan. & Sw. ny, Goth. niujis, Lith. naujas, Russ. novuii, Ir. nua, nuadh, Gael. nuadh, W.… …   The Collaborative International Dictionary of English

  • New I/O — New I/O, usually called NIO, is a collection of Java programming language APIs that offer features for intensive I/O operations. It was introduced with the J2SE 1.4 release of Java by Sun Microsystems to complement an existing standard I/O. NIO… …   Wikipedia

  • New — (n[=u]), adv. Newly; recently. Chaucer. [1913 Webster] Note: New is much used in composition, adverbially, in the sense of newly, recently, to qualify other words, as in new born, new formed, new found, new mown. [1913 Webster] {Of new}, anew.… …   The Collaborative International Dictionary of English

  • New FM — City of license Newcastle Slogan Hottest Songs from the 80 s, 90 s and Today Frequency 105.3 MHz First air date 6 May 1989 ( …   Wikipedia

  • NEW — ist: das IATA Kürzel für den New Orleans Lakefront Airport das Kfz Kennzeichen des Landkreises Neustadt an der Waldnaab new ist: das Kürzel für die Sprache Newari nach ISO 639 2 New ist ein englischer Familienname. Harry S. New (1858–1937), US… …   Deutsch Wikipedia

  • New — Cette page d’homonymie répertorie les différents sujets et articles partageant un même nom. NEW, sigle composé des trois lettres N, E et W, peut faire référence à : Lakefront Airport, un aéroport régional de la Nouvelle Orléans en Louisiane …   Wikipédia en Français

  • New — New, v. t. & i. To make new; to renew. [Obs.] [1913 Webster] …   The Collaborative International Dictionary of English

  • New TV — est une chaîne de télévision fondée par Tahsin Khayat. Elle se situe à Beyrouth, spécifiquement à la Mazraa . Son service politique est dirigé par la journaliste Maria Maalouf …   Wikipédia en Français

  • New (C++) — In the C++ programming language, new is an operator that allows dynamic memory allocation on the heap. new attempts to allocate enough memory on the heap for the new data and, if successful, returns the address to the newly allocated… …   Wikipedia

  • new — I. adjective Etymology: Middle English, from Old English nīwe; akin to Old High German niuwi new, Latin novus, Greek neos Date: before 12th century 1. having recently come into existence ; recent, modern 2. a. (1) having been seen, used, or known …   New Collegiate Dictionary

  • New — To start a new article in Wikipedia, see Help:Starting a new article. New is an adjective referring to something recently made, discovered, or created. New or NEW may refer to: Contents 1 Film and music 2 …   Wikipedia


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»