Я приведу результат нового в C ++? - PullRequest
0 голосов
/ 27 января 2020

В ответах на вопрос Был ли приведен результат mallo c? был покрыт тем, что мне не нужно и не должен приводить возвращенный void указатель malloc() в C.

Но как обстоят дела с оператором new в C ++?


Есть ли явная причина для only do:

int *p_rt = new int;

вместо

int *p_tr = (int*) new int;

Или я могу выполнить приведение

Ответы [ 5 ]

6 голосов
/ 27 января 2020

new T возвращает T*, поэтому нет необходимости его разыгрывать:

T* p = new T;

Тип возврата malloc, с другой стороны, void*, поэтому он должен быть приведен к T* в C ++:

T* p = static_cast<T*>(malloc(sizeof(T));

Также обратите внимание, что, как указано в комментарии , new T не только выделяет память для нового объекта , но также создает объект в этой памяти. malloc не делает этого, поэтому вы должны сконструировать объект вручную с помощью размещение new.

2 голосов
/ 27 января 2020

Есть ли явная причина сделать:

int *p_rt = new int;

вместо

int *p_rt = (*int) new int;

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

PS Ваша попытка приведения синтаксически неверна.

1 голос
/ 27 января 2020

Правка, внесенная в вопрос, преобразованный в ответ

Правка: Моя путаница возникла из-за того, что я прочитал void* operator new (std::size_t size); в http://www.cplusplus.com/reference/new/operator%20new/ и думал, что new вернется void*.

Благодаря комментариям @Someprogrammerdude и @UlrichEckhardt я столкнулся с тем, что оператор new и operator new - это две разные вещи и что new в отличие от malloc() явно возвращает указатель соответствующего типа.

Для всех, кто столкнется с этим вопросом в будущем, я хотел бы предоставить ссылку на вопрос, где разница между ними описана явно: Разница между 'новым оператор 'и' оператор новый '?

0 голосов
/ 27 января 2020

C позволяет компилятору выполнять неявное преобразование из указателя void* в другой тип указателя, поэтому возвращаемое значение malloc() не нужно явно приводить к типу в C.

C ++ не позволяет компилятору выполнять такое неявное преобразование, поэтому возвращаемое значение malloc() должно быть явно приведено к типу в C ++.

Приведение типа не требуется для возвращаемого значения new в C ++, поскольку он возвращает указатель создаваемого им типа, он не возвращает указатель void*.

0 голосов
/ 27 января 2020

в отличие от mallo c () оператор new в c ++ уже возвращает указатель выделенного типа. Так что нет необходимости кастовать. В c проверка типов не является строгой, поэтому вам не нужно приводить void * к нужному типу. Данные будут автоматически интерпретированы как тип, который вы указали. Если вы размещаете в C ++ с mallo c, с другой стороны, вам следует разыграть (иначе вы можете получить предупреждения компилятора).

...