Висячий указатель

Делает эту часть вывода кода к висячему указателю. Мое предположение нет.

class Sample
{
public:
int *ptr;
Sample(int i)
{
ptr = new int(i);
}

~Sample()
{
delete ptr;
}
void PrintVal()
{
cout << "The value is " << *ptr;
}
};

void SomeFunc(Sample x)
{
cout << "Say i am in someFunc " << endl;
}

int main()
{
Sample s1 = 10;
SomeFunc(s1);
s1.PrintVal();
}
5
задан ckv 6 June 2010 в 05:01
поделиться

2 ответа

Да. Конструктор копирования Sample вызывается, когда вы передаете s1 в SomeFunc. Конструктор копирования по умолчанию делает неглубокую копию, поэтому ptr будет удален дважды.

8
ответ дан 14 December 2019 в 04:31
поделиться

Да, как сказал пользователь.

~Sample() {
  delete ptr; // Pointer deleted but left dangling
  ptr = NULL; // Pointer is no longer dangling
}

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

0
ответ дан 14 December 2019 в 04:31
поделиться
Другие вопросы по тегам:

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