- Бортовой компьютер (как настроить, что показывает, проблемы и т.д.) Кашкай J10
- Рекомендованные сообщения
- Присоединяйтесь к обсуждению
- Похожие публикации
- Сейчас на странице 0 пользователей
- Бортовой компьютер (как настроить, что показывает, проблемы и т.д.) Кашкай J10
- Рекомендованные сообщения
- Присоединяйтесь к обсуждению
- Похожие публикации
- Сейчас на странице 0 пользователей
- Ptr place nissan что значит?
- Класс auto_ptr
- СинтаксисSyntax
- ПараметрыParameters
- КонструкторыConstructors
- Определения типовTypedefs
- ФункцииFunctions
- auto_ptrauto_ptr
- ПримерExample
- Первый электрокар Nissan Laef ZE0 и его неисправности
- Жизнь необычного кузова
- Уникальность салона
- Электрическая связка
- Надежность первого Лифа
- Вывод
- Пять подводных камней при использовании shared_ptr
- Перекрестные ссылки
- Безымянные указатели
- Проблема использования в разных потоках
- Особенности времени разрушения освобождающего функтора для shared_ptr
- Особенности работы с шаблоном enable_shared_from_this
Бортовой компьютер (как настроить, что показывает, проблемы и т.д.) Кашкай J10
Автор: som,
30 апреля 2009 в Электрооборудование
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Похожие публикации
системой ЕСО кто-нибудь пользуется?
прочитала в Руководстве по эксплуатации на стр. 5-65, что можно ездить всегда с этим режимом, а вот при движении с грузом или на затяжном подъеме этот режим не используется.
вот думаю: ездить как обычно, или нажать кнопулю?
Приветствую!
Помогите, пожалуйста, девушке разобраться со странностями.
У меня Кашкай салонный. Прошло 3 года гарантии и вдруг почему-то после последнего ТО (месяца 2 назад), датчик температуры вместо привычных глазу 3 шашечек показывает уже 6-ть — это середина всей шкалы, причем сейчас при холодной погоде, осень- почти зима на дворе. Теоретически я понимаю, что пока ничего не горит и не переваливает за жирные деления, видимо нечего бояться. Но внутри что-то екнуло и возник законный вопрос, на который хочу услышать мнение специалистов.
Какова норма температуры в шашечках/делениях? :))
И второе, может ли данное совпадение с последним гарантийным ТО в салоне быть не случайным? Если это поможет, салон Мэйджор Авто.
Заране очень благодарю!
Сейчас на странице 0 пользователей
Нет пользователей, просматривающих эту страницу.
Источник
Бортовой компьютер (как настроить, что показывает, проблемы и т.д.) Кашкай J10
Автор: som,
30 апреля 2009 в Электрооборудование
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Похожие публикации
системой ЕСО кто-нибудь пользуется?
прочитала в Руководстве по эксплуатации на стр. 5-65, что можно ездить всегда с этим режимом, а вот при движении с грузом или на затяжном подъеме этот режим не используется.
вот думаю: ездить как обычно, или нажать кнопулю?
Приветствую!
Помогите, пожалуйста, девушке разобраться со странностями.
У меня Кашкай салонный. Прошло 3 года гарантии и вдруг почему-то после последнего ТО (месяца 2 назад), датчик температуры вместо привычных глазу 3 шашечек показывает уже 6-ть — это середина всей шкалы, причем сейчас при холодной погоде, осень- почти зима на дворе. Теоретически я понимаю, что пока ничего не горит и не переваливает за жирные деления, видимо нечего бояться. Но внутри что-то екнуло и возник законный вопрос, на который хочу услышать мнение специалистов.
Какова норма температуры в шашечках/делениях? :))
И второе, может ли данное совпадение с последним гарантийным ТО в салоне быть не случайным? Если это поможет, салон Мэйджор Авто.
Заране очень благодарю!
Сейчас на странице 0 пользователей
Нет пользователей, просматривающих эту страницу.
Источник
Ptr place nissan что значит?
Класс auto_ptr
- 11/04/2016
- Чтение занимает 5 мин
Заключает в оболочку интеллектуальный указатель вокруг ресурса, что гарантирует, что ресурс будет удален автоматически, когда точка управления выходит за пределы блока.Wraps a smart pointer around a resource that ensures the resource is destroyed automatically when control leaves a block.
Более мощный класс unique_ptr имеет более высокий приоритет, чем auto_ptr.The more capable unique_ptr class supersedes auto_ptr. Дополнительные сведения см. в разделе Класс unique_ptr.For more information, see unique_ptr Class.
Дополнительные сведения о throw() и об обработке исключений см. в статье Спецификации исключений.For more information about throw() and exception handling, see Exception Specifications (throw).
СинтаксисSyntax
auto_ptr(); Type& operator*() const throw(); Type * operator->()const throw(); Type *get() const throw(); Type *release()throw(); void reset(Type* ptr = 0);>;
ПараметрыParameters
Правильноright
auto_ptr, из которого необходимо получить существующий ресурс.The auto_ptr from which to get an existing resource.
указательptr
Указатель, указанный для замены сохраненного указателя.The pointer specified to replace the stored pointer.
Шаблон класса описывает смарт-указатель, называемый auto_ptr , для выделенного объекта.The class template describes a smart pointer, called an auto_ptr, to an allocated object. Указатель должен быть либо null, либо обозначать объект, выделенный new .The pointer must be either null or designate an object allocated by new. auto_ptr передает право владения, если сохраненное значение присваивается другому объектуThe auto_ptr transfers ownership if its stored value is assigned to another object. (Он заменяет сохраненное значение после перемещения с пустым указателем.
) Деструктор для auto_ptr удаления выделенного объекта.(It replaces the stored value after a transfer with a null pointer.) The destructor for auto_ptr deletes the allocated object. auto_ptr гарантирует, что выделенный объект автоматически удаляется при выходе точки управления за пределы блока даже с использованием созданного исключения.The auto_ptr ensures that an allocated object is automatically deleted when control leaves a block, even through a thrown exception. Не следует создавать два объекта auto_ptr, владеющих одним объектом.
You should not construct two auto_ptr objects that own the same object.
Вы можете передать объект auto_ptr по значению в виде аргумента в вызове функции.You can pass an auto_ptr object by value as an argument to a function call. auto_ptr не может быть элементом любого контейнера стандартной библиотеки.An auto_ptr cannot be an element of any Standard Library container. Вы не можете надежно управлять последовательностью объектов auto_ptr с помощью контейнера стандартной библиотеки C++.You cannot reliably manage a sequence of auto_ptr objects with a C++ Standard Library container.
КонструкторыConstructors
auto_ptrauto_ptr | Конструктор для объектов типа auto_ptr.The constructor for objects of type auto_ptr. |
Определения типовTypedefs
element_typeelement_type | Этот тип является синонимом для параметра шаблона Type.The type is a synonym for the template parameter Type. |
ФункцииFunctions
getget | Эта функция-член возвращает сохраненный указатель myptr.The member function returns the stored pointer myptr. |
отпусканииrelease | Этот член заменяет сохраненный указатель myptr на пустой указатель и возвращает сохраненный ранее указатель.The member replaces the stored pointer myptr with a null pointer and returns the previously stored pointer. |
resetreset | Эта функция-член вычисляет выражение delete myptr, но только если значение сохраненного указателя myptr изменяется после вызова функции.The member function evaluates the expression delete myptr, but only if the stored pointer value myptr changes as a result of function call. Затем она заменяет сохраненный указатель на ptr.It then replaces the stored pointer with ptr. |
auto_ptrauto_ptr
Конструктор для объектов типа auto_ptr.The constructor for objects of type auto_ptr.
explicit auto_ptr(Type* ptr = 0) throw(); auto_ptr(auto_ptr& right) throw(); auto_ptr(auto _ptr_ref right) throw(); template auto _ptr(auto _ptr& right) throw();
ПримерExample
// auto_ptr_auto_ptr.cpp// compile with: /EHsc#include #include #include using namespace std; class Int Nissan Leaf ZE0 – первый массовый электромобиль марки, ставший лидером в этом сегменте. Серьезно, после выхода в 2010 году модель продавалась удивительно большим тиражом. В России ее никогда не выпускали официально, но люди ввозили их из Японии и продавали здесь. Частенько хэтчбек встречается на дорогах Ставрополя. Модель выпускалась до 2017 года, после ее сменило второе поколение. Из-за отсутствия опыта бренд постоянно отслеживал жизнь владельцев. В 2013 году инженеры исправили некие моменты, а кузов сменил индекс с ZE0 на AZE0. Электрических хэтчбеков много на вторичном рынке, но стоит ли его покупать и почему цена такая разная? Сегодня мы решили рассказать про все эти нюансы, чтобы будущий покупатель или просто интересующийся человек понимал, что это такое и какового жить с Лифом. Выглядит машина немного странно, но построили ее на платформе V, также используемую Тиидой и Микрой. Есть некие визуальные сходства с собратьями, но достаточно и уникальных моментов. В передней части интересно выглядят крупные фары и отсутствие решетки радиатора. Последнее обыграли нижним небольшим воздухозаборником, по бокам которого вставлены противотуманные фары.Первый электрокар Nissan Laef ZE0 и его неисправности
Жизнь необычного кузова
Ввезенные машины, а это все, нужно проверить через сервисы, чтобы найти ДТП в истории. Американские электрокары проверяйте через Carfax, а японские через Copart. После аварий Nissan Leaf ржавеет сильнее. Естественная ржавчина обычного немного атакует днище, а автомобили прожившие больше года в России рискуют коррозией арок и порогов.
Уникально выглядит задняя часть, которую сделали такой из соображений аэродинамики. Тут интересные формы вертикальных фонарей и форма багажника. В бампере ничего не обычного нет.
Определить рестайлинговый хэтчбек можно по крышке зарядного порта около капота. В дорестайле его ставили за задним диваном. Рестайлу также добавили подсветку порта и функцию запирания порта.
Уникальность салона
Ее не так много как кажется – это оформление центральной консоли и интересный селектор КПП, перекочевавший во второе поколение. По качеству материалов ничего удивительного нет, хотя топовые версии Лифа получают кожаные кресла, чаще кожа встречается в американцах.
Внутри пространства не так много, автомобиль все-таки маленький и предназначен для города. Доработка 2013 года коснулась даже багажника, ведь убрали порт зарядки, занимавший 40 литров. Объем багажника AZE0 – 370 литров. Внутри нет запаски и даже места под нее.
Касаемо размеров хэтчбека:
- длина – 4445 мм;
- ширина – 1770 мм;
- высота – 1550 мм;
- колесная база – 2700 мм;
- клиренс – 156 мм.
Руль пилота – знакомая формой 3-спицевая баранка с разными кнопками. Необычно первое время смотрелась 2-этажная приборная панель (без сравнения с Хондой Цивик 8). у электронный спидометр, ниже монитор, отображающий все остальные данные.
На центральной консоли Nissan Leaf стоит сенсорная мультимедиа с навигацией Carwings и масса кнопок ниже с синей подсветкой. Отметить стоит систему отопления, которая важна для России. В дорестайле стояла жидкостная система, циркулирующая через радиатор. Такую же ставят бензиновым автомобилям, но электрический двигатель таких температур не достигает, поэтому салон прогревается долго.
Лучше отдать предпочтение более дорогому рестайлингу AZE0, где установили электрические нагреватели и тепловой насос. С такой системой скорость прогрева салона способна обойти классические двигатели.
Электрическая связка
Электро | 0.0 л | 109 л.с. | 280 H*m | 11.9 сек. | 145 км/ч |
Электро | 0.0 л | 109 л.с. | 254 H*m | 11.5 сек. | 144 км/ч |
Электро | 0.0 л | 109 л.с. | 254 H*m | 11.5 сек. | 144 км/ч |
С точки зрения уникальности двигателя на самом деле здесь минимум удивительных решений.
Это синхронный двигатель, выдающий 109 лошадиных сил и 280 H*m крутящего момента, доступных во всем диапазоне.
Питается двигатель Leaf от 24 кВт*ч литий-ионного аккумулятора, состоящего из 192 ячеек. Аккумулятор весит 300 кг и обеспечивает 200 км хода в зависимости от стиля езды и типа замера. В рестайлинге уменьшили вес двигателя на 10 кг и его размер, также улучшили систему рекуперации, что увеличило запас хода до 228 км. Опционально стали предлагать 30 кВт*ч батарею, способную пройти 280 км на одном заряде.
В реальности получается чуть больше 100 км, если использовать машину нормально. Гонять точно не стоит, да и 12-секундный разгон не позволит этого сделать.
Американские версии имели систему подогрева батарей, что важно. Низкая температура сильно снижает эффективность работы аккумулятора, запас хода и его срок службы. Зарядить Nissan Leaf можно от обычной розетки, на что уходит 10 часов, а можно от мощной зарядки (под крышкой два порта), на что потребуется час, но такую нагрузку аккумуляторы не любят. Если есть деньги покупайте за 300 тысяч собственную зарядку, которая потратит 4 часа до полной зарядки.
Режим повышенной рекуперации позже перебрался на второе поколение.
Классической коробки передач нет, вся мощность идет передней оси через одноступенчатый редуктор. Платформа дала хэтчбеку независимую переднюю подвеску со стойками МакФерсон и полунезависимую заднюю балку.
Надежность первого Лифа
Особых сложностей здесь нет кроме доступности деталей и совершенно непривычной конструкции. Владельцу нужно каждые 30 тысяч километров менять масло в редукторе. Основные проблемы сводятся к литий-ионной батарее.
Ниссан давал гарантию до 8 лет и встроил прибор SoH, показывающий степень износа аккумулятора. Первое деление прибора означает потерю 15% емкости, все остальные деления забирают 6,25%. Производитель обещал после 10 лет сохранение 70% емкости, но здесь все неоднозначно.
Аккумулятор больше боится перегрева, что показала статистика пользователей США. Высокая температура быстрее съедает емкость, а еще его убивает быстрая зарядка CHAdeMO. Именно от количества делений зависит цена на вторичном рынке и естественно обманщиков нашлось много.
Не честные продавцы могут обнулить пробег, автомобиль начинает думать, что аккумулятор новый, отображая все деления. Через несколько дней активной эксплуатации Nissan Leaft показатели возвращаются к реальным. Второй более интересный способ – заморозка датчика температуры и вставка резистора вместо него. Система при отрицательной температуре за бортом не считает показания.
Решение простое – купить диагностическое ПО Spy, которое при подключении покажет все данные независимо от махинаций продавца. Это того стоит, ведь покупка нового аккумулятора за 300 тысяч рублей явно дороже.
В остальном все нормально, как и во всех соплатформенных моделях (речь про подвеску).
Найти себе такой электрически хэтчбек не проблема, их действительно много на вторичном рынке для электрокара. Ценник совершенно разный из-за года выпуска, положения руля и состояния батарей. Низ рынка Leaf ZE0 начинается с 300 000 рублей и легко доходит до миллиона рублей (таких предложений много).
Присматриваться лучше к верхней категории, но все равно проверять машины, ведь обнуление пробега делают именно для повешения ценника.
Вывод
Это для фанатов или любителей экологии. Жить с таким б/у японцем сложно из-за неразвитой инфраструктуры. Если вы готовы на все непривычные сложности, то первый Nissan Leaf брать можно, предварительно хорошо изучив состояние аккумуляторов. Эксплуатировать его можно только в городе, вам точно не подойдет электрокар, если ездите по межгороду.
Пять подводных камней при использовании shared_ptr
Класс shared_ptr — это удобный инструмент, который может решить множество проблем разработчика. Однако для того, чтобы не совершать ошибок, необходимо отлично знать его устройство. Надеюсь, моя статья будет полезна тем, кто только начинает работать с этим инструментом.
Я расскажу о следующем:
- что такое перекрестные ссылки;
- чем опасны безымянные shared_ptr;
- какие опасности подстерегают при использовании shared_ptr в многопоточной среде;
- о чем важно помнить, создавая свою собственную освобождающую функцию для shared_ptr;
- какие существуют особенности использования шаблона enable_shared_from_this.
Описанные проблемы имеют место как для boost::shared_ptr, так и для std::shared_ptr. В конце статьи вы найдете приложение с полными текстами программ, написанных для демонстрации описываемых особенностей (на примере библиотеки boost).
Перекрестные ссылки
Данная проблема является наиболее известной и связана с тем, что указатель shared_ptr основан на подсчете ссылок. Для экземпляра объекта, которым владеет shared_ptr, создается счетчик. Этот счетчик является общим для всех shared_ptr, указывающих на данный объект. При конструировании нового объекта создается объект со счетчиком и в него помещается значение 1. При копировании счетчик увеличивается на 1. При вызове деструктора (или при замене указателя путем присваивания, или вызова reset), счетчик уменьшается на 1.
Рассмотрим пример:struct Widget < shared_ptr otherWidget;>; void foo() < shared_ptr a(new Widget); shared_ptr b(new Widget); a->otherWidget = b; // В этой точке у второго объекта счетчик ссылок = 2 b->otherWidget = a; // В этой точке у обоих объектов счетчик ссылок = 2> Что произойдет при выходе объектов a и b из области определения? В деструкторе уменьшатся ссылки на объекты. У каждого объекта будет счетчик = 1 (ведь a все еще указывает на b, а b — на a).
Объекты “держат” друг друга и у нашего приложения нет возможности получить к ним доступ — эти объекты “потеряны”. Для решения этой проблемы существует weak_ptr. Одним из типичных случаев создания перекрестных ссылок является случай, когда один объект владеет коллекцией других объектов struct RootWidget < list widgets;>; struct Widget < shared_ptr parent;>; При таком устройстве каждый Widget будет препятствовать удалению RootWidget и наоборот. В таком случае нужно ответить на вопрос: “Кто кем владеет?”.
Очевидно, что именно RootWidget в данном случае владеет объектами Widget, а не наоборот. Поэтому модифицировать пример нужно так: struct Widget < weak_ptr parent;>; Слабые ссылки не препятствуют удалению объекта. Они могут быть преобразованы в сильные двумя способами: 1) Конструктор shared_ptrweak_ptr w = …;// В случае, если объект уже удален, в конструкторе shared_ptr будет сгенерировано исключениеshared_ptr p( w ); 2) Метод lockweak_ptr w = …;// В случае, если объект уже удален, то p будет пустым указателемif( shared_ptr p = w.
lock() )/>
Вывод: В случае возникновения в коде кольцевых ссылок, используйте weak_ptr для решения проблем.
Безымянные указатели
Проблема безымянных указателей относится к вопросу о “точках следования” (sequence points)// shared_ptr, который передается в функцию foo — безымянныйfoo( shared_ptr(new Widget), bar() ); // shared_ptr, который передается в функцию foo имеет имя pshared_ptr p(new Widget);foo( p, bar() ); Из этих двух вариантов документация рекомендует всегда использовать второй — давать указателям имена. Рассмотрим пример, когда функция bar определена вот так:int bar() < throw std::runtime_error(“Exception from bar()”);>Дело в том, что в первом случае порядок конструирования не определен.
Все зависит от конкретного компилятора и флагов компиляции. Например, это может произойти так:
- new Widget
- вызов функции bar
- конструирование shared_ptr
- вызов функции foo
Наверняка можно быть уверенным лишь в том, что вызов foo будет последним действием, а shared_ptr будет сконструирован после создания объекта (new Widget). Однако никаких гарантий того, что он будет сконструирован сразу после создания объекта, нет.
Если во время второго шага будет сгенерировано исключение (а оно в нашем примере сгенерировано будет), то Widget будет считаться сконструированным, но shared_ptr еще не будет им владеть. В итоге ссылка на этот объект будет потеряна. Я проверил данный пример на gcc 4.7.2. Порядок вызова был таким, что shared_ptr+new вне зависимости от опций компиляции не разделялись вызовом bar. Но полагаться именно на такое поведение не стоит – это не гарантировано. Буду признателен, если мне подскажут компилятор, его версию и опции компиляции, для которых подобный код приведет к ошибке.
Еще одна возможность для обхода проблемы анонимных shared_ptr — это использование функций make_shared или allocate_shared. Для нашего примера это будет выглядеть так: foo( make_shared(), bar() ); Данный пример выглядит даже более лаконично, чем исходный, а так же обладает рядом преимуществ в плане выделения памяти (вопросы эффективности оставим за пределами статьи). Допустим вызов make_shared с любым количество аргументов. Например следующий код вернет shared_ptr на строку, созданную через конструктор с одним параметром.
make_shared(«shared string»);
Вывод: Давайте shared_ptr имена, даже если код будет от этого менее лаконичным, либо воспользуйтесь для создания объектов функциями make_shared и allocate_shared.
Проблема использования в разных потоках
Подсчет ссылок в shared_ptr построен с использованием атомарного счетчика. Мы без опаски используем указатели на один и тот же объект из разных потоков. Во всяком случае, мы не привыкли беспокоиться о подсчете ссылок (потокобезопасность самого объекта – другая проблема). Допустим, у нас есть глобальный shared_ptr:shared_ptr globalSharedPtr(new Widget); void read() < shared_ptr x = globalSharedPtr; // Сделать что-нибудь с Widget>Запустите вызов read из разных потоков и вы увидите, что никаких проблем в коде не возникает (до тех пор, пока вы выполняете над Widget потокобезопасные для этого класса операции).
Допустим, есть еще одна функция:void write() < globalSharedPtr.reset( new Widget );>Устройство shared_ptr достаточно сложно, поэтому я приведу код, который схематически поможет показать проблему. Разумеется, настоящий код выглядит иначе.shared_ptr::shared_ptr(const shared_ptr& x) counter;A3: atomic_increment( *counter );> shared_ptr::reset(T* newObject) А может быть и так, что поток1 на строке A2 успеет увеличить счетчик до того, как поток2 вызовет удаление объектов, но после того как поток2 произвел уменьшение счетчика. Тогда мы получим новый shared_ptr, указывающий на удаленный счетчик и объект. Можно написать подобный код:shared_ptr globalSharedPtr(new Widget);mutex_t globalSharedPtrMutex; void resetGlobal(Widget* x) < write_lock_t l(globalSharedPtrMutex); globalSharedPtr. Вывод: если какой-то экземпляр shared_ptr доступен разным потокам и может быть модифицирован, то необходимо позаботиться о синхронизации доступа к этому экземпляру shared_ptr. Данная проблема может иметь место только в том случае, если вы используете собственный освобождающий функтор в сочетании со слабыми указателями (weak_ptr). Например, вы можете создать shared_ptr на основе другого shared_ptr, добавив новое действие перед удалением (по сути шаблон “Декоратор”). Так вы могли бы получить указатель для работы с базой данных, изъяв его из пула соединений, а по окончании работы клиента с указателем — вернуть его обратно в пул. get(), ConnectionReleaser( connectionList, c ) ); return r; > Возможен так же вариант, когда вы воспользуетесь bind для создания освобождающего функтора. Например так:void releaseConnection(std::list& whereToReturn, ptr_t& connectionToRelease) < whereToReturn.push_back( connectionToRelease ); // Обратите внимание на следующую строчку connectionToRelease.reset();>ptr_t getConnection() < ptr_t c( connectionList.back() ); connectionList.pop_back(); ptr_t r( c. get(), boost::bind(&releaseConnection, boost::ref(connectionList), c) ); return r;> Помните, что bind копирует переданные ему аргументы (кроме случая с использованием boost::ref), и если среди них будет shared_ptr, то его тоже следует очистить, дабы избежать уже описанной проблемы. Вывод: Выполните в освобождающей функции все действия, которые необходимо совершить при разрушении последней сильной ссылки. Сбросьте все shared_ptr, которые по какой-то причине являются членам вашего функтора. Если вы используете bind, то не забывайте, что он копирует переданные ему аргументы. Иногда требуется получить shared_ptr из методов самого объекта. Попытка создания нового shared_ptr от this приведет к неопределенному поведению (скорее всего к аварийному завершению программы), в отличие от intrusive_ptr, для которого это является обычной практикой. Для решения этой проблемы был придуман шаблонный класс-примесь enable_shared_from_this. Шаблон enable_shared_from_this устроен следующим образом: внутри класса содержится weak_ptr, в который при конструировании shared_ptr помещается ссылка на этот самый shared_ptr. При вызове метода shared_from_this объекта, weak_ptr преобразуется в shared_ptr через конструктор. Схематически шаблон выглядит так:template class enable_shared_from_this < weak_ptr weak_this_;public: shared_ptr shared_from_this() < // Преобразование слабой ссылки в сильную через конструктор shared_ptr shared_ptr p( weak_this_ ); return p; >>; class Widget: public enable_shared_from_this <>; Конструктор shared_ptr для этого случая схематически выглядит так:shared_ptr::shared_ptr(T* object) < pointer = object; counter = new Counter; object->weak_this_ = *this;> Важно понимать, что при конструировании объекта weak_this_ еще ни на что не указывает. Правильная ссылка в нем появится только после того, как сконструированный объект будет передан в конструктор shared_ptr. Любая попытка вызова shared_from_this из конструктора приведет к bad_weak_ptr исключению.struct BadWidget: public enable_shared_from_this < BadWidget() < // При вызове shared_from_this() будет сгенерировано bad_weak_ptr cout Источник
Особенности времени разрушения освобождающего функтора для shared_ptr
Проблема заключается в том, что объект, переданный в качестве освобождающего функтора для shared_ptr, будет разрушен только тогда, когда все ссылки на объект будут уничтожены — как сильные(shared_ptr), так и слабые(weak_ptr). Таким образом, если ConnectionReleaser не позаботится о том, чтобы “отпустить” переданный ему указатель (connectionToRelease), он будет держать сильную ссылку, пока существует хотя бы один weak_ptr от shared_ptr, созданного функцией getConnection. Это может привести к достаточно неприятному и неожиданному поведению вашего приложения.Особенности работы с шаблоном enable_shared_from_this