2016-04-05 5 views
-2

2. Учитывая определения,Динамическое назначение указателя C++

int *p1, *p2; 
p1 = new int; 
p2 = new int; 

В чем разница между следующими двумя заданиями.

a) p1 = p2; 
b) *p1 = *p2 
+1

Вы должны пометить его соответствующим языком. Но, в любом случае, первое назначение делает указатели равными (например, утечка памяти). Второй - значения, указывающие указатели. Я думаю, что это довольно очевидно. –

ответ

1

а) вы назначая p2 (который является адресом) для p1.So при разыменовать p1 вы получите значение такой же, как * p2. Если вы измените * p2, чем * p1 также изменится. В основном, в этом типе назначения p1 и p2 оба ссылаются на одно и то же адресное местоположение. Это приведет к утечке памяти, хотя адрес, назначенный p1, больше не упоминается.

b) В этом случае значение в * p2 присваивается * p1. Но они все еще указывают на другое местоположение адреса. Если вы измените значение * p2 после назначения, оно не изменит * p1.

+0

какой тип значений находится в разыменованных p1 и p2 при тестировании. Я получаю p1 0137C330. p2 is 0137C330 * p1 is -842150451 Нажмите любую клавишу, чтобы продолжить. , , – CanyoucSharp

+0

спасибо Я думаю, что понимаю сейчас – CanyoucSharp

+0

Вы запрашиваете тип данных? Вы можете распечатать значение и проверить его. – denis

2

Вы забыли указать язык, но, я думаю, вы имели в виду C или C++.

a) Простой адрес. p1 будет указателем на p2. Таким образом, вы получаете два указателя, указывающих на один экземпляр int. Это означает, что вы теряете указатель на p1, перезаписывая его, но его намерение останется в памяти undesigned, и вы не сможете его освободить или даже получить к нему доступ! (Если вы не скопировали p1 в другое место ...) Используйте valgrind, чтобы это увидеть. Однако, когда вы звоните delete p1, вы освобождаете даже int, на что указывает p2. Любое использование p2, вероятно, закончится ошибкой сегментации.

b) Вы назначаете значение p2, p1, что означает, что вы получаете два динамически выделенных указателя, как со значением p2. Но они будут двумя независимыми независимыми экземплярами int! Так что если вы delete p1, p2 по-прежнему будут доступны.

+0

Начинал писать комментарий к принятому ответу о утечке памяти, а затем читать ваши ... так что тоже есть upvote! :) – CompuChip

Смежные вопросы