Механизм выделения и освобождения стековой памяти - PullRequest
0 голосов
/ 11 декабря 2010

Если я передам по значению в качестве аргумента определенной функции, будет ли эта функция освобождать память этого параметра, когда выполнение функции завершится?

Если я передам указатель или ссылку в качестве аргумента, что произойдет, если функция освободит память аргумента указателя?Повлияет ли это на переменную вне функции?

Ответы [ 3 ]

0 голосов
/ 11 декабря 2010

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

Для второго - да, освобождение с помощью указателя повлияет на память, к которой он обращается - как внутри функциии снаружи.

Для пояснения второго пункта:

void func(char *someMemory) {
  delete[] someMemory;
}

//...
char *myArray = new char[100];
func(myArray);

... удалит выделенную память - с помощью myArray после вызова func будет BAD.

0 голосов
/ 20 апреля 2011

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

Как работает стек, вы можете сохранить "выделение «больше памяти, но оно должно быть« освобождено »в обратном порядке.

Итак:

void f(int *ptr, int v)
{
// Do something
}

Когда вы вызываете f (), значения ptr и v« помещаются »встек, то есть достаточно памяти волшебным образом создается для хранения этих значений.Когда функция возвращает стек, он корректируется другим способом, в некотором смысле они «выталкиваются» из стека.

Это нажатие и выталкивание не влияют на исходный указатель или значение.Итак:

ptr++;

Будет не влиять на значение указателя, удерживаемого вызывающей функцией.

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

0 голосов
/ 11 декабря 2010

В первом случае память будет «освобождена» (фактически указатель стека будет увеличен).Если это не переменная типа POD, вызывается деструктор, поэтому память будет освобождена из кучи, если она была там выделена.

Во втором случае значение, на которое ссылается указатель, не будет освобождено - только память для указателя будетбыть освобожденным.

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