Как удалить указатель, не удаляя данные, на которые указывает указатель? - PullRequest
7 голосов
/ 08 мая 2010

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

например:

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

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

Ответы [ 8 ]

12 голосов
/ 08 мая 2010

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

10 голосов
/ 08 мая 2010

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

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

10 голосов
/ 08 мая 2010

Позволить ему выйти за рамки?

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

4 голосов
/ 08 мая 2010

Обычно, чтобы сделать указатель «безопасным», просто установите его в 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 голосов
/ 08 мая 2010

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

3 голосов
/ 08 мая 2010

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

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

1 голос
/ 08 мая 2010

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

1 голос
/ 08 мая 2010
int** pointer1 = new int *;
* pointer1 = new int [1000];
int* pointer2;
pointer2 = * pointer1;
delete pointer1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...