1 / 1 / 0
Регистрация: 20.09.2017
Сообщений: 27
|
||||||
1 | ||||||
Утечка при комбинации сырого и умного указателя24.06.2019, 14:29. Показов 1417. Ответов 12
Метки нет Все метки)
(
После выхода из блока shared_ptr вызывает деструкторы объектов, но они почему-то остаются в unordered_set и последний for их успешно разыменовывает.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
24.06.2019, 14:29 | |
Ответы с готовыми решениями:
12
Реализация умного указателя
Использование умного указателя std::weak_ptr |
16463 / 8963 / 2198
Регистрация: 30.01.2014
Сообщений: 15,561
|
|
24.06.2019, 14:37 | 2 |
Uncleewe, шутить изволите? Откуда ж сету знать, что вы объект уничтожили?
![]()
0
|
1 / 1 / 0
Регистрация: 20.09.2017
Сообщений: 27
|
|
24.06.2019, 14:45 [ТС] | 3 |
У меня же в сете указатели, а не объекты. Shared_ptr чистит память и указатели из сета должны указывать в никуда. Где я не прав?
0
|
16463 / 8963 / 2198
Регистрация: 30.01.2014
Сообщений: 15,561
|
|
24.06.2019, 14:51 | 4 |
Опять наделяем указатели какой-то выдуманной магией?
![]() От того, что вы освободили память по заданному адресу, указатель в set не стал указывать в магическое "никуда". Он все так же указывает на ту же память, ведь адрес вы не меняли. Не меняли же? Не меняли. Другое дело, что теперь память не принадлежит вам, и вы не можете ее легально использовать. Память отдана обратно менеджеру кучи.
1
|
6574 / 4559 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
24.06.2019, 14:52 | 5 |
0
|
1 / 1 / 0
Регистрация: 20.09.2017
Сообщений: 27
|
|
24.06.2019, 15:00 [ТС] | 6 |
DrOffset, ну не в никуда
![]()
0
|
5666 / 3112 / 1299
Регистрация: 07.02.2019
Сообщений: 7,803
|
|
24.06.2019, 15:10 | 7 |
del
0
|
16463 / 8963 / 2198
Регистрация: 30.01.2014
Сообщений: 15,561
|
||||||||||||||||||||||||||
24.06.2019, 15:11 | 8 | |||||||||||||||||||||||||
![]() Решение
Не станет он nullptr. С чего вы взяли?
Да даже если бы и стал. Допустим мы сами напишем такой delete:
p
![]() другой объект.Вот вам абсолютно аналогичный пример:
![]()
0
|
6574 / 4559 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
24.06.2019, 15:12 | 9 |
0
|
16463 / 8963 / 2198
Регистрация: 30.01.2014
Сообщений: 15,561
|
|
24.06.2019, 15:14 | 10 |
Да, в том числе и старые данные. Но обращаться к ним нельзя. При таком обращении вся ваша программа входит в некорректное состояние и поведение ее предсказать уже нельзя.
1
|
1 / 1 / 0
Регистрация: 20.09.2017
Сообщений: 27
|
|
24.06.2019, 15:19 [ТС] | 11 |
oleg-m1973, тогда придётся перегружать hash и equal. И я упростил код. Если у меня будет здесь weak_ptr, то придётся наследовать от enable_shared_from_this и это еще не все проблемы. Я бы хотел пока разобраться с более простыми вещами
![]()
0
|
6574 / 4559 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
24.06.2019, 15:23 | 12 |
Зачем? Наследоваться надо только если ты хочешь получать shared_ptr по ссылке на объект, иначе не нужно
0
|
1 / 1 / 0
Регистрация: 20.09.2017
Сообщений: 27
|
|
24.06.2019, 15:25 [ТС] | 13 |
oleg-m1973, я же говорю, что упростил код. Мне и надо передавать this.
0
|
24.06.2019, 15:25 | |
Помогаю со студенческими работами здесь
13
Не выводится сообшения от деструктора для умного указателя Написать шаблон умного указателя для массива Как привести тип умного указателя к указателю на void? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |