![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Alek86 |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
у меня некоторое время уже пишется немелкая прога
и лишь сравнительно недавно я начал использовать boost::shared_ptr так вот, поскольку раньше я работал с обычными указателями, то подобные конструкции встречались нередко:
а вот теперь, как я понял преимущества shared_ptr, функции типа Func1 стали принимать shared_ptr'ы. И получилась ситуация:
как бы это можно провернуть, чтобы работало? Это сообщение отредактировал(а) Alek86 - 12.11.2007, 19:49 |
||||
|
|||||
| JackYF |
|
||||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Передаёшь локальную переменную, она уничтожается сейчас же, не гуд.
возможно,
|
||||
|
|||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
|
|||
|
||||
| Alek86 |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
в реале все чуток сложнее
к примеру, так:
выход вижу в том, чтобы хранить рядом с
еще и
но, имхо, не очень удобно, так как надо следить за m_MyClass, чтобы переназначать m_MyClassSharedPtr, когда m_MyClass меняется.... Добавлено @ 21:34 Fazil6, так бы я догадался, но дело в том, что код старый и работает - не хочется его весь менять Добавлено через 3 минуты и 32 секунды а, да, еще его МНОГО Добавлено через 14 минут и 57 секунд зачем указатель передавать по ссылке? Это сообщение отредактировал(а) Alek86 - 12.11.2007, 21:34 |
||||||
|
|||||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
это так, на пробу. Возможно, и незачем. |
|||
|
||||
| Fazil6 |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
заколебешься пыль глотать потом. Это будет несопровождаемо. Пользуйся либо одним, либо другим
заменить на
дальше компилятор скажет где исправить (выкинуть delete и в аргументах). Использование m_MyClass как указателя никак не изменится с изменением на shared_ptr Но, если стоит выбор между альтернативами, нужно остановиться на чем-то одном. На 2-х стульях тяжело усидеть. |
||||
|
|||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
неужели так мало у кого такие проблемы возникали, что при проектировании shared_ptr не учли возможность такой поддержки старого кода? :(
|
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
||||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
? это скажи Страуструпу вообще весь С++ на том и держится, что старый код менять сильно не нужно |
|||
|
||||
| Fazil6 |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
так ты же сильно хочешь его менять... Рассмотри еще вариант расширения интерфейса, в котором используется буст чтобы он мог принимать указатель, чтобы его можно было использовать в старом коде не переделывая ничего в этом старом коде
какой такой? Чтобы деструктор shared_ptr не вызывал delete ? Нахрен он тогда нужен? Все, что надо там учли. |
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Если старая функция не сохраняет указатель на объект и не пытается его удалить, то можно ее оставить до поры до времени. Но если старая ф-я гденибудь сохранит указатель на объект, то возможна ситуация когда этот указатель проживет дольше чем все shared_ptr-ы на тот-же объект и если программа попробует к нему обратица, то будет AV (aka segfault). Так-что как уже здесь не раз сказали проще исправить все функции.
До использования shared_ptr я использовал свой велосипед, базовый класс поддерживал подсчет ссылок, а его деструктор был защищенным. Благодаря этому нельзя было создать такой объект в стеке. Класс указателя который работал с моим указателем был объявлен другом, короче в результате работать с такими объектами возможно только через мою версию смарт-поинтера, и это спасало от многих ошибок |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Извините, если прерву ваш спор ни о чём, но изначальная проблема решается элементарно - достаточно взглянуть на описание класса shared_ptr(можно даже не читать - просто взглянуть).
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
||||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Кстати, если уж часто этим пользоваться, то я бы сделал так:
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
тогда вопрос вдогонку
такой, что, типа, лень самому искать, так что не матюкайтьесь, плиз есть стандартный функтор, что ничего не делает? Добавлено через 1 минуту и 39 секунд ЗЫ. скорее всего нету, но "а вдруг?" |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |