C ++ новый оператор - PullRequest
       6

C ++ новый оператор

2 голосов
/ 05 марта 2012

Допустим, у меня есть

class A
{
  int A1;
  void Af();
};

Тогда я делаю:

A  hA;
A* pA = new A();

сейчас, hA - это объект в стеке;Я могу использовать

hA.A1 = 52 // for example

, но pA просто указывает на class A, насколько это полезно или удобно?(какие-нибудь примеры, пожалуйста?)

второй выпуск:

когда я сделал A* pA = new A();я что-то выделил в куче?был ли malloc() на заднем плане?Если нет, то почему?и почему int * p_array = new int [5] будет выделять память в куче 5 дюймов, а не A * pA = new A ()?

Ответы [ 4 ]

4 голосов
/ 05 марта 2012
A  hA = new A();

приводит к ошибке компилятора.Правильный способ определения переменной «в стеке» -

A ha;

, но pA просто указывает на класс A, насколько это полезно или полезно (какие-либо примеры, пожалуйста?)

В каком-то месте памяти у вас есть объект типа A, и pa указывает на него.Если вы хотите установить член A1 этого объекта равным 52, вы пишете

pA->A1 = 52;

Почему это полезная часть - не настоящий вопрос.

, когда я сделал A* pA = новый A ();я что-то выделил в куче?

Да, вы сделали.new делает две вещи: выделяет память и вызывает конструктор.

Был ли какой-нибудь malloc () в фоновом режиме?

Это не определено, но во многих реализациях new реализуется через malloc

и как получается int [] A = A [42]выделит память в куче 42 дюйма, а не A pA = new A ()?

Это, сэр, также является ошибкой компилятора.Вы имели в виду

int* A = new A[42];

Это operator new[], который распределяет массивы в куче и при необходимости вызывает конструкторы (в случае целых чисел это не так).

0 голосов
/ 06 марта 2012

но pA просто указывает на класс A, насколько это полезно или удобно?(какие-нибудь примеры, пожалуйста?)

Это полезно и удобно, потому что теперь у вас есть адрес экземпляра класса A, который существует не в стеке, а в куче.Так что он выживет, если вы выйдете из области видимости (возврат из функции и т. Д.).Вы можете обвести указатель повсюду, и ваш экземпляр останется

, когда я сделал A * pA = new A ();я что-то выделил в куче?был ли какой-нибудь malloc () на заднем плане?

Да Да и да, в этом смысл нового оператора.

0 голосов
/ 06 марта 2012

но pA просто указывает на class A, как это полезно или удобно?(какие-нибудь примеры, пожалуйста?)

Дело не в этом.pA указывает на объект A, поэтому *pA является объектом точно так же, как hA является объектом:

(*pA).A1 = 52 // for example

Когда вы делаете A* pA = new A(), да, происходит динамическое распределение.Не обязательно вызов malloc(), но что-то.(Игнорирование использования пользовательского operator new, который может делать все что угодно)

new A() делает две основные вещи.Он выделяет место для объекта где-то.И если это удастся, тогда он создаст объект того типа, который вы запросили в этом месте.Если объект построен успешно, он просто возвращает указатель на объект.

0 голосов
/ 06 марта 2012

Один раз для указателей на объекты используется, когда емкость или объем данных неизвестны во время компиляции. Хорошим примером является получение текста от пользователя. Будет ли пользователь вводить 5 символов, 10, 1k?

Если моя программа выделяет 1 Кб, и пользователь никогда не вводит более 32 символов, это пустая трата места.

Другое использование для динамического выделения памяти - передача информации между объектами:
Объект 1 создает книгу, но не несет ответственности за ее уничтожение.
Объект 2 корректирует книгу, генерирует список исправлений, но не уничтожает книгу.
Объект 3 Добавляет таблицы в книгу, но не уничтожает ее.
Объект 4 Сохраняет книгу, затем уничтожает ее.

Пожалуйста, прочитайте «Часто задаваемые вопросы по C ++» для быстрых ответов на распространенные вопросы по C ++.

...