Разница между созданием указателя с «новым» и без «нового», кроме выделения памяти? - PullRequest
0 голосов
/ 27 октября 2018

В чем разница между этими указателями?

Я знаю, что этот будет храниться в куче, хотя указатель в любом случае всего 8 байт, поэтому память для меня не важна.

int* aa = new int;
aa = nullptr;

и этот будет храниться в стеке.

int* bb = nullptr;

Они оба, кажется, работают одинаково в моей программе.Есть ли разница, кроме распределения памяти?У меня такое ощущение, что второй по какой-то причине плохой.

2) Еще один вопрос, который в некоторой степени связан с этим: действительно ли создание такого указателя занимает больше памяти?Если мы посмотрим на первый фрагмент, он где-то создает int (4 байта), а затем создает указатель на него (8 байтов), так что это всего 12 байтов?Если да, то они оба в куче?Я могу сделать это, так что это означает, что int существует:

*aa = 20;

1 Ответ

0 голосов
/ 27 октября 2018

Указатели - это целые числа, которые просто указывают позицию в памяти и тип (поэтому они могут указывать только на переменные этого типа).

Так что в ваших примерах все указатели хранятся в стеке (если ониявляются глобальными переменными, но это другой вопрос).То, на что они указывают, находится в куче, как в следующем примере.

void foo()
{
    int * ptr = new int(42);

    // more things...

    delete ptr;
}

Вы можете иметь указатель, указывающий на стек, например, таким образом:

void foo()
{
    int x = 5;
    int * ptr = &x;

    // more things...
}

Оператор '&' получает позицию в памяти переменной x в приведенном выше примере.

nullptr является типизированным эквивалентом старого NULL.Они являются способом инициализации указателя на известное и безопасное значение, что означает, что они не указывают ни на что другое, и что вы можете сравнить, являются ли они НЕДЕЙСТВИТЕЛЬНЫМИ или нет.

Программа будет принимать указатели, указывающие настек или куча: это не имеет значения.

void addFive(int * x)
{
    *x += 5;
}

void foo()
{
    int x = 5;
    int * ptr1 = &x;
    int * ptr2 = new int(42);

    addFive( ptr1 );
    addFive( ptr2 );
    addFive( &x );

    printf( "%d\n", *ptr1 );
    printf( "%d\n", *ptr2 );

    // more things...

    delete ptr2;
}

Единственное отличие состоит в том, что среда выполнения C будет сохранять структуры, сообщающие, сколько памяти было потрачено в куче, и, следовательно, хранение переменных в куче происходитпо стоимости в исполнении.С другой стороны, стек всегда ограничен фиксированным объемом памяти (относительно небольшим), а куча намного больше, что позволяет хранить, например, большие массивы.

Вы можете взглянуть на C-Sim , который имитирует память на C (заявление об отказе: я ее написал).

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...