Передача указателей в функции по ссылке по значению и использование удаления в цепочках указателей - PullRequest
4 голосов
/ 20 января 2012

Допустим, я делаю это:

void func ( int* & refptr)
{    
     *refptr = 7;
}

int* ptr = new int;
func( ptr );

Теперь, если я остановлю опорный оператор, разве не будет сделано то же самое в func?В любом случае вы получаете доступ к одному и тому же значению int в куче, так что один способ предпочтительнее другого?Должен ли ссылочный оператор использоваться только при попытке изменить местоположение, на которое указывает указатель ...?Мне неясно, и мой профессор не поможет.: (

Мой другой вопрос связан с оператором удаления. Допустим, у меня есть:

int** ptr = new int*;

ptr* = new int;

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

Большое вам спасибо.

Ответы [ 2 ]

4 голосов
/ 21 января 2012

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

Вам понадобится два удаления в вашем случае.Вот как будет выглядеть память после ваших вызовов:

// Memory: free
int ** ptr = new int*;
// Memory: four bytes allocated for int*
ptr* = new int;
// Memory: four bytes allocated for int*, four bytes allocated for int

Вам нужно одно удаление для четырех байтов, выделенных для int, одно удаление для четырех байтов, выделенных для int *.

3 голосов
/ 21 января 2012

В вашем первом примере нет никакой разницы. Ссылки используются для модификации, а также во избежание копирования (что на самом деле не имеет значения в случае указателя).

Во втором вопросе у вас нет правильного синтаксиса (*ptr не ptr*), но да, вы должны удалить массив и его содержимое отдельно.

Вы можете использовать стандартные типы библиотек шаблонов (shared_ptr, unique_ptr) для автоматического удаления содержащихся объектов при удалении контейнера.

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