С++ что такое "pointer = new type" в качестве противопоставления "pointer = new type []"?
во многих турзаменах первые примеры кода о динамической памяти начинаются по строкам:
int * pointer;
pointer = new int; // version 1
//OR
pointer = new int [20] // version 2
они всегда начинают объяснять, как работает вторая версия, но полностью избегайте говорить о первой версии.
что я хочу знать, что создает pointer = new int
? что я могу с этим сделать? что это значит? В каждом учебном пособии обязательно расскажу о первой версии полностью. Все, что я узнал (через messing about), следующее:
#include <iostream>
using namespace std;
int main()
{
int * pointer;
pointer = new int;
pointer[2] = 1932; // pointer [2] exists? and i can assign to it?!
cout << pointer[2] << endl; // ... and access it succesfuly?!
};
Тот факт, что я могу индексировать pointer
, говорит мне до сих пор, что я pointer = new int
неявно создает массив. но если да, то какой размер?
Если бы кто-то помог мне все это очистить, я был бы великолепен...
Ответы
Ответ 1
Это типичная ошибка для C и С++ для начинающих. Первое предложение создает пространство для размещения только int
. Второй создает пространство для хранения 20 из этих int
s. В обоих случаях, однако, он присваивает адрес начала динамически зарезервированной области переменной pointer
.
Чтобы добавить к путанице, вы можете получить доступ к указателям с индексами (по мере того, как вы помещаете pointer[2]
), даже если указана память, которую они указывают, недопустима. В случае:
int* pointer = new int;
вы можете получить доступ к pointer[2]
, но у вас будет поведение undefined. Обратите внимание, что вам нужно проверить, что эти обращения на самом деле не происходят, и компилятор обычно может делать это в случае предотвращения такого типа ошибок.
Ответ 2
Это создает только одно целое число.
pointer = new int; // version 1
Это создает 20 целых чисел.
pointer = new int [20] // version 2
Ниже указано недопустимое значение, поскольку указатель [2] переводится как * (указатель + 2); который не был создан/выделен.
int main()
{
int * pointer;
pointer = new int;
pointer[2] = 1932; // pointer [2] exists? and i can assign to it?!
cout << pointer[2] << endl; // ... and access it succesfuly?!
};
Ура!
Ответ 3
Мой учитель объяснил это так.
Подумайте о кино. Фактические места - это распределения памяти, а билет, который вы получаете, является указателем.
int * pointer = new int;
Это будет кинотеатр с одним местом, и указатель будет билетом на это место.
pointer = new int [20]
Это будет кинотеатр на 20 мест, а указатель будет билетом на первое место. указатель [1] будет билетом на второе место, а указатель [19] будет билетом на последнее место.
Когда вы выполняете int* pointer = new int;
и затем получаете доступ к pointer[2]
, вы позволяете кому-то сидеть в проходе, то есть undefined поведение
Ответ 4
new int[20]
выделяет память для целого массива размером 20 и возвращает указатель на него.
new int
просто выделяет память для одного целого числа и возвращает указатель на него. Неявно, это то же самое, что и new int[1]
.
Вы можете разыменовать (т.е. использовать *p
) для обоих указателей, но вы должны использовать p[i]
для указателя, возвращаемого new int[20]
.
p[0]
будет по-прежнему работать на обоих, но вы можете ошибаться и ошибочно вводить неверный индекс.
Обновить. Еще одно отличие состоит в том, что для массива необходимо использовать delete[]
и delete
для целого числа.
Ответ 5
pointer = new int
выделяет достаточно памяти в куче, чтобы сохранить один int
.
pointer = new int [20]
выделяет память для хранения 20 int
s.
Оба вызова возвращают указатель на вновь выделенную память.
Примечание. Не полагайтесь на инициализированную выделенную память, она может содержать случайные значения.
Ответ 6
pointer = new int;
выделяет целое число и сохраняет его адрес в pointer
. pointer[2]
является синонимом pointer + 2
. Чтобы понять это, прочитайте об арифметике указателя. Эта строка на самом деле является undefined поведением, потому что вы получаете доступ к памяти, которую вы ранее не выделяли, и она работает, потому что вам повезло.
Ответ 7
* "Тот факт, что я могу индексировать указатель, говорит мне до сих пор, что я pointer = new int
неявно создает массив, но если да, то какой размер он?"
*
Это была часть вопроса, который мне больше всего понравился, и который вы подчеркиваете.
Как мы все знаем, динамическое распределение памяти использует пространство в стеке, которое относится к данной программе.
Когда мы более подробно рассмотрим определение нового оператора: -
void* operator new[] (std::size_t size) throw (std::bad_alloc);
Это фактически представляет массив объектов этого конкретного размера, и если это успешно, то он автоматически Создает каждый из объектов в массиве. Таким образом, мы можем использовать объекты в пределах размера, потому что они уже инициализированы/построены.
int * pointer = new int;
С другой стороны, для приведенного выше примера есть всякая возможность поведения undefined, когда любой из
*(pointer + k) or *(k + pointer)
. Хотя доступ к определенной ячейке памяти можно получить с помощью указателей, нет никакой гарантии, потому что конкретный объект для нее не был создан и не сконструирован. Это можно рассматривать как пространство, которое не было выделено в стеке для конкретной программы.
Надеюсь, это поможет.
Ответ 8
int* p = new int
выделяет память для одного целого. Это не приводит к созданию массива. То, как вы обращаетесь к указателю с помощью p[2]
, приведет к поведению undefined при записи в недопустимую ячейку памяти. Вы можете создать массив, только если вы используете синтаксис new[]
. В таком случае вам нужно освободить память, используя delete[]
. Если вы выделили память с помощью new
, значит, вы создаете один объект, и вам нужно освободить память с помощью delete
.
Ответ 9
Он не создает массив. Он создает единственное целое число и возвращает указатель на это целое число. Когда вы пишете указатель [2], вы ссылаетесь на память, которую вы не выделили. Вы должны быть осторожны и не делать этого. Эта память может быть отредактирована из внешней программы, которую вы, я верю, не хочу.
Ответ 10
int * pointer; pointer = new int; // version 1
//OR
pointer = new int [20] // version 2
что я хочу знать, что создает pointer = new int
? что я могу с этим сделать? что это значит? В каждом учебном пособии обязательно расскажу о первой версии полностью
Причина, по которой учебник не отвлекает вас от того, что с ним делать, заключается в том, что он действительно абсолютно бесполезен! Он выделяет один int
и дает вам указатель на это.
Проблема в том, что если вам нужен int, почему бы вам просто не объявить его?
int i;