88 / 88 / 80
Регистрация: 25.08.2013
Сообщений: 337
1

Определение и изменение shared_ptr

20.03.2016, 13:00. Показов 1715. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Из книги не понял вот такую форму определения интеллектуального указателя.
C++
1
2
3
4
5
6
7
8
9
    int *q = new int();
    //shared_ptr<int> p(q); тут понятно, опасная инициализация встроенным указ. 
 
    shared_ptr<int> p(q, /*вызываемый объект*/); // а тут не пойму...
 
    // 1. в каком виде вызываемый объект? 
    // 2. какие должны быть аргументы, возвращаемое значение у объекта?
    // 3. что он должен(может) делать?
    // 4. в каких случаях?
В книге пишут, указатель p учитывает собственность объекта, на который указывает встроенный указатель q. Тип указателя q должен быть преобразуем в тип int*(в нашем примере). Для освобождения q указатель p будет использовать вызываемый объект вместо оператора delete. Что это значит?

Следом подобная форма
C++
1
shared_ptr<int> p(p2, /*вызываемый объект*/);
Где указатель p - это копия указателя p2 типа shared_ptr (это понятно), как описано в таблице такой-то, за исключение того, что указатель p использует вызываемый объект вместо оператора delete. Тоже самое.. Что это значит?
1. в каком виде вызываемый объект?
2. какие должны быть аргументы, возвращаемое значение у объекта?
3. что он должен(может) делать?
4. в каких случаях?
Миниатюры
Определение и изменение shared_ptr  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.03.2016, 13:00
Ответы с готовыми решениями:

Определение события на изменение даты
Добро время суток, мне нужно написать штуку, которая будет реагировать на изменение даты, которая...

Определение и изменение кодировки Txt файлов
Возможно ли определить и изменить кодировку txt файла в целом?

Определение размера картинки и изменение расположения кнопки.
Доброго времени суток! подскажите какой метод, поможет опредилить высоту картинки и по этим данным...

Shared_ptr
Есть следующий код: int main() { std::map&lt;std::string, std::shared_ptr&lt;int&gt;&gt; mp; while...

7
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
20.03.2016, 13:11 2
Цитата Сообщение от yrceus Посмотреть сообщение
тут понятно, опасная инициализация встроенным указ.
А мне не понятно, что там опасного. Расскажете?
0
2 / 2 / 1
Регистрация: 28.09.2013
Сообщений: 255
20.03.2016, 13:15 3
А что за книга?
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
20.03.2016, 13:16 4
Лучший ответ Сообщение было отмечено yrceus как решение

Решение

Цитата Сообщение от yrceus Посмотреть сообщение
Для освобождения q указатель p будет использовать вызываемый объект вместо оператора delete. Что это значит?
Ну это значит, что для удаления вместо delete будет вызван вызываемый объект. Рассмотрим пример:
C++
1
std::shared_ptr<int> p(new int(10),[](int* c) { delete c; c = 0; });
Тут для удаления инта будет вызвана лямбда.

Добавлено через 1 минуту
Цитата Сообщение от yrceus Посмотреть сообщение
C++
1
//shared_ptr<int> p(q); тут понятно, опасная инициализация встроенным указ.
Тут, кстати, ничего опасного.
2
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
20.03.2016, 13:21 5
GbaLog-, может быть он имел ввиду, что после передача под контроль умному указателю можно затереть delete q; и умный об этом не узнает.

Но с таким подходом весь С++ не безопасный)
2
88 / 88 / 80
Регистрация: 25.08.2013
Сообщений: 337
20.03.2016, 13:23  [ТС] 6
GbaLog-,
C++
1
std::shared_ptr<int> p(new int(10),[](int* c) { delete c; c = 0; });
То есть дальше при выходе p из области видимости или удалении p(освобождении reset) будет происходить вызов лямбды с передачей ей в качестве аргумента самого p?

rikimaru2013, А если же p при каких-нибудь условиях раньше выйдет из видимости, он удалит свое содержимое, q потеряется. Правильно же? Или если мы возвратим q из этой области, то оно тоже будет впоследствии не определенно.


vab9petryk, Стенли Липман.
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
20.03.2016, 13:25 7
Лучший ответ Сообщение было отмечено yrceus как решение

Решение

Цитата Сообщение от yrceus Посмотреть сообщение
То есть дальше при выходе p из области видимости или удалении p(освобождении reset) будет происходить вызов лямбды с передачей ей в качестве аргумента самого p?
Да.
1
88 / 88 / 80
Регистрация: 25.08.2013
Сообщений: 337
20.03.2016, 13:42  [ТС] 8
rikimaru2013, Я понял о чем вы) Ну да, это глупо так допустить, но по книге настоятельно не рекомендуют)

Добавлено через 15 минут
GbaLog-, спасибо еще раз, теперь очевидно, а перед этим голову поломал.
0
20.03.2016, 13:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.03.2016, 13:42
Помогаю со студенческими работами здесь

C++ 11 shared_ptr
Есть вопрос из теста You have some code that creates a HardwareContext object representing a...

Shared_ptr
Всем хай. Есть некий класс и в нём такой метод: class Base { public: ...

This для shared_ptr
Как создать объект shared_ptr, в котором будет лежать this?

Shared_ptr vs make_shared
Всем добрый день! Такой вопрос - изучаю shared_ptr и make_share, и узнала, что разница между...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru