Как C ++ обрабатывает очистку указателей, переданных в качестве аргументов? - PullRequest
4 голосов
/ 26 декабря 2011

Я проводил некоторые исследования того, как C ++ обрабатывает указатели, переданные в качестве аргументов, но пока не смог найти надежного ответа «да / нет» на мой вопрос.

Нужно ли мневызвать delete / free для них, или C ++ достаточно умен, чтобы очистить их самостоятельно?

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

Спасибо!

Ответы [ 5 ]

9 голосов
/ 26 декабря 2011

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

Так, например:

void foo(int *p)  // p is a copy here
{
    return;
    // The memory used to hold p is cleared up,
    // but not the memory used to hold *p
}

int main()
{
    int *p = new int;
    foo(p);   // A copy of p is passed to the function (but not a copy of *p)
}

Вы часто будете слышать, как люди говорят о «в куче» и «в стеке»". * Локальные переменные (например, аргументы) хранятся в стеке, который автоматически очищается.Данные, выделенные с помощью new (или malloc), хранятся в куче, которая не очищается автоматически.


* Однако стандарт C ++ не говорит о «стеке»"и" куча "(это на самом деле детали реализации).Используются термины «автоматическое хранение» и «выделенное хранилище» соответственно.
4 голосов
/ 26 декабря 2011

Аргументы, передаваемые методу, сохраняются в стеке, поэтому автоматически уничтожаются при возврате функции - как локальные переменные.Память, на которую они указывают, не освобождается автоматически.

2 голосов
/ 26 декабря 2011

Если вы получаете указатель от своего вызывающего абонента, то вызывающий абонент несет ответственность за освобождение этого указателя, если не указано иное.

1 голос
/ 26 декабря 2011

На самих указателях нет.Они идут, когда кадр стека параметров удаляется при возврате функции, так же, как параметры типа int или char.Нужно ли вам что-то делать с указанными данными, между вами и вашим кодом.

1 голос
/ 26 декабря 2011

Указатели будут скопированы - приняты «по значению». Когда функция существует, они будут уничтожены, но поскольку их деструкторы тривиальны, ничего не будет сделано с памятью, на которую они указывают.

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