“новый” оператор в C++, вопросе об указателе

Немой вопрос, но каждый раз, когда Вы называете новыми, у Вас всегда есть указатель?

SomeClass *person = new SomeClass();

И то, что, потому что Вам нужен указатель для указания на то новое пространство памяти, которая была выделена для человека переменной SomeClass?Спасибо!

12
задан Crystal 28 April 2010 в 01:54
поделиться

5 ответов

Если new завершается успешно, он всегда возвращает указатель (в случае неудачного завершения выдается исключение, и ничего возвращается).

Указатель - это созданный объект или, в случае массива, указатель на первый элемент массива.

15
ответ дан 2 December 2019 в 07:20
поделиться

Да. Если вы спрашиваете, почему вместо этого он не возвращает ссылку, поскольку ссылки лучше, чем указатели, ответ - историческое наследие.

Когда C ++ находился в разработке, если машине не удавалось получить память для объекта, возвращался специальный указатель NULL . Вот как это делается в C:

SomeClass *person;
person = (SomeClass*) malloc( sizeof( SomeClass ) );
if ( person == NULL ) fprintf( stderr, "no more people allowed!" );

В стандартном C ++ ошибки вместо этого возвращаются в виде исключения:

try {
    SomeClass *person = new SomeClass;
    // do something
} catch ( std::bad_alloc ) {
    std::cerr << "no more people!" << std::endl;
} catch ( ... ) {
    // using exceptions allows for other errors
    // from inside SomeClass::SomeClass too
}

Вы все еще можете делать это по старинке, используя nothrow :

SomeClass *person = new( std::nothrow ) SomeClass;
if ( person == NULL ) std::cerr << "no more people allowed!" << std::endl;

В итоге, это вполне разумный и хороший стиль:

SomeClass &person = * new SomeClass; // don't need no stinkin pointers!
1
ответ дан 2 December 2019 в 07:20
поделиться

Новое выражение возвращает указатель, но вы можете использовать его с классами «умных указателей» (например, из Boost ). Итак:

boost::shared_ptr<SomePerson> person(new SomePerson);

Я также должен указать, что, хотя вы можете использовать круглые скобки, если вы пришли из фона Java, в C ++ скобки не нужны при использовании конструктора по умолчанию. Так, например, при построении по умолчанию обычно записывается new T , но записывается new T (param) или new T (param1, ..., paramN) при создании объекта с использованием конструктора, отличного от конструктора по умолчанию.

Да, это правильно; теоретически можно было бы написать (new SomePerson) -> doSomething (), но это было бы утечкой памяти; В C ++ нет сборки мусора, поэтому необходимо сохранить результат нового выражения в чем-то (указателе или интеллектуальном указателе), чтобы его можно было должным образом освободить.

0
ответ дан 2 December 2019 в 07:20
поделиться

Да, всегда указатель. Даже если вы хотите перегрузить новый , тип возврата должен быть void * .
И вы правы насчет цели

3
ответ дан 2 December 2019 в 07:20
поделиться

new создает объект в куче, и все, что он может вернуть, - это его адрес - указатель.

2
ответ дан 2 December 2019 в 07:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: