Жить в куче или стеке при использовании нового оператора в функциональном блоке? - PullRequest
0 голосов
/ 28 мая 2020

Например:

void Func()
{
    int* i = new int; // the simplest case

    vector<int*> v = new vector<int*>; // another case, not sure if **new** is using correctly here
    vector<int*>* vPointer = new vector<int*>; 
}

void main()
{
    Func();
}

Итак, если я выделяю динамическую c память (с помощью нового оператора) для локальных переменных в функциях,

  1. Живут ли они куча или стек?
  2. когда программа выходит из функции, они все еще болтаются в куче или уничтожаются как переменные функции?
  3. Могу ли я использовать новый оператор для типов, не являющихся указателями? Как удалить (или вернуть обратно выделенную память кучи) его позже?

Спасибо!

1 Ответ

2 голосов
/ 28 мая 2020
int i = 3;

это создает в стеке объект типа int. (В стандарте C ++ используется термин «автоматическое c хранилище», и я обычно сторонник правильного использования формальных терминов, но «стек» и «куча» глубоко встроены в словарь программирования, поэтому «стек» и « куча "просто хороши как технические термины).

int *ip = 0;

это создает объект типа int* в стеке. ip содержит нулевой указатель.

int *ip = new int;

это создает в стеке объект типа int*, как и предыдущий. Он содержит указатель на память в куче (см. Ранее круглые скобки; формальный термин - «свободное хранилище»). Вы знаете, что память находится в куче, потому что это то, что делает operator new.

Когда вы закончите с памятью кучи, вы должны освободить ее:

delete ip;

если вы не Если не удалить его, а функция, которая его создала, вернет, локальная переменная (ip), которая содержала указатель, исчезла. Память была выделена и не была освобождена, поэтому, если вы не скопировали указатель в какое-то другое место, у вас не будет возможности получить выделенную память. Это называется «утечкой памяти».

...