Привет, не могли бы вы уточнить вопрос? Похоже, где-то есть опечатка.
Дима Маленко
17
Вопрос сформулирован правильно, ответы см. Ниже. Метод динамического выделения памяти заключается в использовании newоператора. Этот оператор может быть перегружен. Чтобы различать оператор по умолчанию и перегруженную версию, значение по умолчанию называется «новый оператор», а перегруженная версия называется «оператор новый».
Thomas Matthews
2
Как это сделать. Я новичок и ничего не знаю.
Sandeep
Ответы:
127
Я обычно пытаюсь сформулировать вещи по-другому, чтобы лучше различить их, но в любом случае это хороший вопрос.
Оператор new - это функция, которая выделяет необработанную память - по крайней мере, концептуально она не сильно отличается от malloc(). Хотя это довольно необычно, если вы не пишете что-то вроде своего собственного контейнера, вы можете напрямую вызвать оператора new, например:
char*x =static_cast<char*>(operatornew(100));
Также возможно перегрузить оператор new либо глобально, либо для определенного класса. IIRC, подпись:
void*operatornew(size_t);
Конечно, если вы перегружаете оператор new (глобальный или для класса), вы также захотите / должны перегрузить соответствующий оператор delete. Как бы то ни было, есть также отдельный оператор new [], который используется для выделения памяти для массивов - но вам почти наверняка лучше полностью игнорировать весь этот беспорядок.
Оператор new - это то, что вы обычно используете для создания объекта из бесплатного хранилища:
my_class *x =new my_class(0);
Разница между ними в том, что оператор new просто выделяет необработанную память и ничего больше. Оператор new начинается с использования оператора new для выделения памяти, но затем он вызывает конструктор для объекта правильного типа, поэтому результатом является реальный живой объект, созданный в этой памяти. Если этот объект содержит какие-либо другие объекты (встроенные или как базовые классы), эти конструкторы также вызываются.
+1, что касается другой формулировки, стандарт использует новое выражение повсюду, и только один раз он использует новый оператор для ссылки на место вызова. Я обычно делаю то же самое: оператор new для распределителя и выражение new для использования.
Дэвид Родригес - dribeas
3
Новое выражение - это целая фраза, которая начинается с нового. Итак, что вы называете «новой» частью? Если неправильно называть этот оператор new, тогда мы не должны называть sizeof оператором sizeof или & оператором адреса (когда он ведет себя как один).
Kaz
1
В продолжение замечания Каза, возможно, вопрос следует перефразировать так: в чем разница между оператором new и оператором new? :)
CS
2
"оператор новый" против "новое ключевое слово"
user997112 08
2
@antred: Вы бы выпустили это с чем-то вроде operator delete(x);.
Джерри Коффин,
35
"оператор новый"
classFoo{public:void*operatornew(size_t);}
«новый оператор»:
Foo* foo =newFoo();
В этом примере new Foo()вызовыFoo::operator new()
Другими словами, "новый оператор" вызывает " operator new()" точно так же, как оператор + вызываетoperator +()
newне является оператором в C ++. sizeof, например, является оператором, но так newи deleteне являются. newи deleteявляются ключевыми словами, а синтаксические конструкции, которые образуют эти ключевые слова, называются новым-выражением и удаляющим выражением .
AnT
2
Ну, во всяком случае, sizeofявляется синтаксической конструкцией, и newи deleteявляются действительными, юридические перегрузки способны операторы. Из всего, что я когда-либо видел, newи deleteоба являются операторами. См. [Cplusplus.com] [ cplusplus.com/doc/tutorial/classes2/]
Остин Хайд,
7
Неправильно. Официальная терминология C ++ - это терминология, определенная спецификацией языка, а не каким-либо веб-сайтом. В спецификации языка нет термина «новый оператор», но есть такой термин, как « operator newфункция». Опять же , sizeofэто explicilty называют «оператора», в то время как newи deleteне разу не называют операторами.
AnT
6
AndreyT: Неправильно. Стандарт C ++ действительно вызывает оператор new, см. 13.5 / 1.
3
@AndreyT: Я думал, как и вы, что этот оператор new был распределителем, а новое выражение использовалось. Я просмотрел и проверил, что в §5.3.4 / 3 в текущем стандарте используется термин новый оператор . Позже в §5.3.4 / 8 он называет функции распределителя как operator new и operator new []
Дэвид Родригес - dribeas
22
Ниже приводится цитата Скотта Мейерса из книги «Более эффективный C ++»:
Оператор new вызывает функцию для выполнения необходимого выделения памяти, и вы можете переписать или перегрузить эту функцию, чтобы изменить ее поведение. Имя функции, которую оператор new вызывает для выделения памяти, - оператор new.
Термин явно придуман автором книги (а может быть, заимствован из какого-то устаревшего источника). В формальной номенклатуре C ++ нет такого термина, как «новый оператор».
AnT
2
@AndreyT: Я поискал в C ++ 11 «новый оператор» и обнаружил, что на него есть ссылки в четырех местах. В частности, две ссылки на «размещение нового оператора»
Mooing Duck
11
Нет разницы между «новым оператором» и «новым оператором». Оба относятся к одному и тому же: перегружаемой / заменяемой operator newфункции, которая обычно выполняет необработанное выделение памяти для объектов, созданных с помощью новых выражений .
Также обратите внимание, что ни один термин не присутствует в спецификации языка (которая является определяющим источником официальной терминологии).
Когда вы используете newв своей программе для создания объекта, это называется новым-выражением . Новое выражение состоит из ключевого слова newи дополнительных синтаксических частей, определенных грамматикой. Никакая часть синтаксиса этого выражения никогда не упоминается как «оператор».
Функция выделения необработанной памяти operator newофициально называется просто « operator newфункцией». Обратите внимание, что слова operatorи newв этой последовательности - это всего лишь два отдельных ключевых слова языка C ++. Они не образуют английского термина «оператор новый». Нигде в спецификации языка вы не найдете ссылок на «оператор new» как на английский термин. Каждый раз это просто комбинация двух независимых ключевых слов, которые создают синтаксис объявления для функции распределения памяти.
Опять же, в резюме: формально в C ++ нет таких англоязычных терминов, как «оператор новый» или «новый оператор». Первая последовательность присутствует в спецификации языка как простая комбинация ключевых слов, а не как английский термин. Последнего нет вообще.
Вы, кажется, потерялись в какой-то педантичной мысленной мастурбации. Стандарт расплывчато в пятнах, и это один из них. «Обсудить новый оператор» имеет такой же смысл, как и «обсудить оператор плюс» или «обсудить оператор +».
7
Когда вы создаете новый объект, память выделяется с помощью оператора new, после чего вызывается конструктор для инициализации памяти. Оператор new выполняет как выделение, так и инициализацию, тогда как оператор new выполняет только выделение.
Вопрос ОП сформулирован неправильно. Лучше выполнить этап как «Разница между оператором new» и «новым выражением»? » Обратите внимание, что «оператор новый» часто также относится к «новой функции оператора».
И есть много правильных ответов, ниже мой:
1> 'новое выражение' вызывает 'оператор новый' для выделения необработанной памяти, затем вызывает конструктор
apple * p =new apple();//new expression
2> 'operator new' выделяет только необработанную память, не большая разница, чем malloc
void* mem =operatornew(sizeof(apple));//just like calling malloc()
apple* p2 =new(mem) apple(1);//call construct here using placement new.
Оператор new : C ++ поддерживает динамическое размещение объектов с помощью оператора new. Новый оператор выделяет память для объектов из пула, называемого свободным хранилищем. Оператор new вызывает специальную функцию оператора new.
оператор new : если запрос касается нулевых байтов памяти, оператор new возвращает указатель на отдельный объект (то есть повторные вызовы оператора new возвращают разные указатели). Если памяти для запроса на выделение недостаточно, оператор new возвращает NULL или выдает исключение. Первый аргумент оператора new должен иметь тип size_t (тип, определенный в STDDEF.H), а возвращаемый тип всегда void *.
Вот ссылки MSDN для получения более подробной информации:
Небольшое уточнение: оператор new, не связанный с размещением, всегда должен вызывать сбой выделения (согласно стандарту); и формы размещения, такие как ::new(std::nothrow), могут делать то и другое (этот конкретный пример возвращает нулевой указатель).
1
new - это оператор, а также ключевое слово.
см. [1] в 2.13 && In 2.12.
new делает две вещи: T * t = new T (arg);
1) выделить память для объекта: void * ptr = operator new (sizeof (T));
// оператор new - это функция (как и malloc в c), а не оператор (см. [1] в 3.7.4). Но в пункте 7 [2] сказано, что это тоже оператор. На мой взгляд, разница между оператором и функцией невелика, и вы можете увидеть это, вспомнив, что оператор перегрузки реализуется функциями.
// мы можем перегрузить этот оператор / функцию (оператор new), делая то, что мы хотим, прямо здесь.
2) инициализировать объект в выделенной памяти: вызвать T :: T (arg) на ptr
// это может сделать только компилятор. Ни я, ни ты не сможем.
// также компилятор будет вызывать конструкторы объектов-членов и конструктор базового класса, если они у T есть. И этот вызов является рекурсивным. Только компилятор может это сделать.
Итак, оператор new выполняет часть миссий new, и только в этой части мы можем что-то делать.
new
оператора. Этот оператор может быть перегружен. Чтобы различать оператор по умолчанию и перегруженную версию, значение по умолчанию называется «новый оператор», а перегруженная версия называется «оператор новый».Ответы:
Я обычно пытаюсь сформулировать вещи по-другому, чтобы лучше различить их, но в любом случае это хороший вопрос.
Оператор new - это функция, которая выделяет необработанную память - по крайней мере, концептуально она не сильно отличается от
malloc()
. Хотя это довольно необычно, если вы не пишете что-то вроде своего собственного контейнера, вы можете напрямую вызвать оператора new, например:Также возможно перегрузить оператор new либо глобально, либо для определенного класса. IIRC, подпись:
Конечно, если вы перегружаете оператор new (глобальный или для класса), вы также захотите / должны перегрузить соответствующий оператор delete. Как бы то ни было, есть также отдельный оператор new [], который используется для выделения памяти для массивов - но вам почти наверняка лучше полностью игнорировать весь этот беспорядок.
Оператор new - это то, что вы обычно используете для создания объекта из бесплатного хранилища:
Разница между ними в том, что оператор new просто выделяет необработанную память и ничего больше. Оператор new начинается с использования оператора new для выделения памяти, но затем он вызывает конструктор для объекта правильного типа, поэтому результатом является реальный живой объект, созданный в этой памяти. Если этот объект содержит какие-либо другие объекты (встроенные или как базовые классы), эти конструкторы также вызываются.
источник
operator delete(x);
."оператор новый"
«новый оператор»:
В этом примере
new Foo()
вызовыFoo::operator new()
Другими словами, "новый оператор" вызывает "
operator new()
" точно так же, как оператор + вызываетoperator +()
источник
new
не является оператором в C ++.sizeof
, например, является оператором, но такnew
иdelete
не являются.new
иdelete
являются ключевыми словами, а синтаксические конструкции, которые образуют эти ключевые слова, называются новым-выражением и удаляющим выражением .sizeof
является синтаксической конструкцией, иnew
иdelete
являются действительными, юридические перегрузки способны операторы. Из всего, что я когда-либо видел,new
иdelete
оба являются операторами. См. [Cplusplus.com] [ cplusplus.com/doc/tutorial/classes2/]operator new
функция». Опять же ,sizeof
это explicilty называют «оператора», в то время какnew
иdelete
не разу не называют операторами.Ниже приводится цитата Скотта Мейерса из книги «Более эффективный C ++»:
источник
Нет разницы между «новым оператором» и «новым оператором». Оба относятся к одному и тому же: перегружаемой / заменяемой
operator new
функции, которая обычно выполняет необработанное выделение памяти для объектов, созданных с помощью новых выражений .Также обратите внимание, что ни один термин не присутствует в спецификации языка (которая является определяющим источником официальной терминологии).
Когда вы используете
new
в своей программе для создания объекта, это называется новым-выражением . Новое выражение состоит из ключевого словаnew
и дополнительных синтаксических частей, определенных грамматикой. Никакая часть синтаксиса этого выражения никогда не упоминается как «оператор».Функция выделения необработанной памяти
operator new
официально называется просто «operator new
функцией». Обратите внимание, что словаoperator
иnew
в этой последовательности - это всего лишь два отдельных ключевых слова языка C ++. Они не образуют английского термина «оператор новый». Нигде в спецификации языка вы не найдете ссылок на «оператор new» как на английский термин. Каждый раз это просто комбинация двух независимых ключевых слов, которые создают синтаксис объявления для функции распределения памяти.Опять же, в резюме: формально в C ++ нет таких англоязычных терминов, как «оператор новый» или «новый оператор». Первая последовательность присутствует в спецификации языка как простая комбинация ключевых слов, а не как английский термин. Последнего нет вообще.
источник
Когда вы создаете новый объект, память выделяется с помощью оператора new, после чего вызывается конструктор для инициализации памяти. Оператор new выполняет как выделение, так и инициализацию, тогда как оператор new выполняет только выделение.
источник
Вопрос ОП сформулирован неправильно. Лучше выполнить этап как «Разница между оператором new» и «новым выражением»? » Обратите внимание, что «оператор новый» часто также относится к «новой функции оператора».
И есть много правильных ответов, ниже мой:
1> 'новое выражение' вызывает 'оператор новый' для выделения необработанной памяти, затем вызывает конструктор
2> 'operator new' выделяет только необработанную память, не большая разница, чем malloc
источник
Оператор new : C ++ поддерживает динамическое размещение объектов с помощью оператора new. Новый оператор выделяет память для объектов из пула, называемого свободным хранилищем. Оператор new вызывает специальную функцию оператора new.
оператор new : если запрос касается нулевых байтов памяти, оператор new возвращает указатель на отдельный объект (то есть повторные вызовы оператора new возвращают разные указатели). Если памяти для запроса на выделение недостаточно, оператор new возвращает NULL или выдает исключение. Первый аргумент оператора new должен иметь тип size_t (тип, определенный в STDDEF.H), а возвращаемый тип всегда void *.
Вот ссылки MSDN для получения более подробной информации:
Оператор new Function
Новый оператор
источник
::new(std::nothrow)
, могут делать то и другое (этот конкретный пример возвращает нулевой указатель).new - это оператор, а также ключевое слово.
см. [1] в 2.13 && In 2.12.
new делает две вещи: T * t = new T (arg);
1) выделить память для объекта: void * ptr = operator new (sizeof (T));
// оператор new - это функция (как и malloc в c), а не оператор (см. [1] в 3.7.4). Но в пункте 7 [2] сказано, что это тоже оператор. На мой взгляд, разница между оператором и функцией невелика, и вы можете увидеть это, вспомнив, что оператор перегрузки реализуется функциями.
// мы можем перегрузить этот оператор / функцию (оператор new), делая то, что мы хотим, прямо здесь.
2) инициализировать объект в выделенной памяти: вызвать T :: T (arg) на ptr
// это может сделать только компилятор. Ни я, ни ты не сможем.
// также компилятор будет вызывать конструкторы объектов-членов и конструктор базового класса, если они у T есть. И этот вызов является рекурсивным. Только компилятор может это сделать.
Итак, оператор new выполняет часть миссий new, и только в этой части мы можем что-то делать.
[1]: ISO / IEC, N3690. http://ww.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf
[2]: Мейерс, Скотт. Эффективный C ++, 3-й.
источник