Как Вы удаляете указатель, не удаляя данные, на которые указывает указатель?

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

например:

int* pointer1 = new int [1000];
int* pointer2;
pointer2 = pointer1;

Теперь я хочу избавиться от pointer1, как я сделал бы это таким образом, что я могу продолжить получать доступ к массиву обычно через pointer2?

7
задан Faken 7 May 2010 в 20:40
поделиться

8 ответов

Эти указатели находятся в стеке; вам не нужно их удалять. Просто игнорируйте указатель1, и он исчезнет в конце блока.

12
ответ дан 6 December 2019 в 04:55
поделиться
int** pointer1 = new int *;
* pointer1 = new int [1000];
int* pointer2;
pointer2 = * pointer1;
delete pointer1;
1
ответ дан 6 December 2019 в 04:55
поделиться

Когда вы статически объявляете указатель с помощью int * pointer1; , вы не можете освободить его. Вы можете освободить только динамически выделяемую память, выделенную с помощью new , malloc и т. Д. Единственный способ «избавиться от» pointer1 - позволить ему выйти за пределы области видимости, например, когда функция вернется. Если вы закончили использовать pointer1 и хотите предотвратить его случайное использование для изменения массива, используйте pointer1 = NULL; .

4
ответ дан 6 December 2019 в 04:55
поделиться

Обычно, чтобы сделать указатель «безопасным», просто установите его в NULL, что заставит его вообще ничего не указывать. Или вы можете просто отпустить это за рамки.

Например, если у вас есть два указателя.

int *a = new int;
int *b = a;

// somewhere    
b = NULL;

delete b; // does nothing now
delete a; // deletes a

Или вы можете позволить этому выпасть из поля зрения.

int *a = new int;

{
 int *b = a;
 // blah blah blah
} 

// don't have to worry about b
delete a;
4
ответ дан 6 December 2019 в 04:55
поделиться

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

1
ответ дан 6 December 2019 в 04:55
поделиться

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

Если вы хотите быть абсолютно уверены, что больше ничто не сможет использовать указатель1, вы можете установить указатель1=NULL, когда закончите с ним.

3
ответ дан 6 December 2019 в 04:55
поделиться

Оставить это за рамки?

Вы не «удаляете» указатели, вы удаляете то, на что они указывают. Поэтому, если вы просто хотите избавиться от переменной 'pointer1', единственный способ сделать это - завершить область, в которой она была создана.

10
ответ дан 6 December 2019 в 04:55
поделиться

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

C и C ++ не отслеживают, сколько указателей указывают на объект или массив. Если вам нужен подсчет ссылок, вам нужно использовать контейнер с подсчетом ссылок, например shared_ptr , или, в данном случае, shared_array (вы можете найти оба из них в Boost, и есть высокая вероятность того, что в вашей реализации они уже есть в либо в пространстве имен std , либо в std :: tr1 ).

10
ответ дан 6 December 2019 в 04:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: