@ProCxx

Страница 1682 из 2477
Berkus
23.01.2018
10:08:42
на C++
oxymoron detected

Anatoly
23.01.2018
10:09:33
я всего лишь занимаюсь пакетированием либ + взаимодействием с русским коммунити
они бы и рады передохнуть, но ты их конкретно педалишь :)

Berkus
23.01.2018
10:09:54
после смерти отдохнут, пакетов еще тьма тьмущая

Alexander
23.01.2018
10:10:04
раз взялись, то пусть делают.

Google
Alexander
23.01.2018
10:10:10
вон пусть пример с vcpkg берут

Maksim
23.01.2018
10:13:20
Это еще что, есть даже вот такое: http://cppconf.ru/workshops/anton-polukhin * а если серьёзно, то у Павла крутой мастер класс, весьма полезный :)
А где эта конференция проходит-то? Хочу поехать, но из сайта не ясно, в каком городе.

Antony
23.01.2018
10:13:39
В Питере

Maksim
23.01.2018
10:13:58
Окей, спасибо.

Ilia
23.01.2018
10:39:28
@berkus , вот гляди. Есть у тебя окно, немодальное. Цикл жизни такой: по событию создаётся , висит на экране, обрабатывает ввод какой-то, события какие-то, потом пользователь его закрывает, когда оно становится ненужным. (оно ОБЯЗАНО создаваться динамически, потому как выйдет из контекста обработки события точно) Попробуй подумать КТО должен им владеть и ГДЕ должен лежать SHARED_PTR или UNIQUE_PTR и кто его будет удалять...

подумал... еще раз подумал... shared_ptr отлично работает даже если сам контролит свое время жизни. мало того, в бисте именно так работает сессия

Antony
23.01.2018
10:43:32
Расскажите поподробнее про "сам контрлолирует свой время жизни"? Ну или пример кода скиньте

Alexander
23.01.2018
10:45:48
http://en.cppreference.com/w/cpp/memory/shared_ptr
@antoshkka может тебе в супапро, если не знаешь, как работает shared_ptr? ?

???

Vsevolod
23.01.2018
10:46:04
вообще, это очень сложный вопрос

чтобы созданный объект сам хранил рефренс на себя

Google
Vsevolod
23.01.2018
10:46:55
я это когда-то давно делал через всякие enable_shared_from_this и самоотстрел специальным методом

Antony
23.01.2018
10:48:18
чтобы созданный объект сам хранил рефренс на себя
Вы про weak_ptr? Или объект хранит именно shared_ptr на самого себя, и когда надо умереть, делает shared_ptr_var.reset() ?

Vsevolod
23.01.2018
10:50:22
я делал с shared, то есть, объект создается через метод, возвращающий std::shared_ptr<T> (с приватным конструктором) и хранит внутри себя этот shared_ptr, пока ему нужно существовать вне зависимости от внешнего мира

а когда это не нужно - зовет reset, да

если внешнему миру это тоже не нужно, то все подыхает

Anatoly
23.01.2018
10:51:03
Я ж описал всё...
кто-то сохраняет weak_ptr, сам диалог примешивает вот такую фигню в виде SharedPtrReady и когда диалог умрет, weak_ptr сможет это определить: struct SharedPtrEmptyDeletor { template<class T> void operator()(T* p) const { } }; template<typename T> struct SharedPtrReady : public std::enable_shared_from_this<T> { public: SharedPtrReady() : fake_shared_ptr_(self(), SharedPtrEmptyDeletor()) { } protected: T* self() { return static_cast<T*>(this); } private: std::shared_ptr<T> fake_shared_ptr_; };

Antony
23.01.2018
10:51:15
а когда это не нужно - зовет reset, да
Вы ведь понимаете, что это лютое UB?

Vsevolod
23.01.2018
10:51:43
почему? доступ делается через один и тот же control block всегда

Antony
23.01.2018
10:52:40
Запустите под санитайзерами ваш код, в тот момент, кодга this - единственный владелец shared_ptr

Vsevolod
23.01.2018
10:53:28
я не понимаю, откуда здесь может взяться UB, если класс делается через enable_shared_from_this

Vsevolod
23.01.2018
10:55:57
а в delete this что плохого?

Ilia
23.01.2018
10:56:06
Ничего

Vsevolod
23.01.2018
10:56:23
тоже валидное использование, если потом не дергать этот this (в т.ч. не вызывая нестатические методы)

Ilia
23.01.2018
10:56:55
Ну обсудили уже в supa...

Anatoly
23.01.2018
11:00:28
@antoshkka @berkus Вообщем ситуация там такая: создано немодальное Windows окно, единственная связь с миром C++ это void* во вспомогательной структуре класса окна. Когда окно закрывается пользователем, С++ объект, ассоциированный с этим окном, должен быть уничтожен. Этот С++ объект подписывается на событие "последнегого выдоха господина пж" и убивает себя через delete this. Такова дислокация.

Alexander
23.01.2018
11:00:28
тоже валидное использование, если потом не дергать этот this (в т.ч. не вызывая нестатические методы)
Это не этот кейс? (не читал весь тред) Before the lifetime of an object has started but after the storage which the object will occupy has been allocated or, after the lifetime of an object has ended and before the storage which the object occupied is reused or released, any pointer that refers to the storage location where the object will be or was located may be used but only in limited ways. [...] If the object will be or was of a class type with a non-trivial destructor, and the pointer is used as the operand of a delete-expression, the program has undefined behavior.

Google
Anatoly
23.01.2018
11:33:10
А держать shared_ptr в обработчике события нельзя?
по сути это call_back функция, вызываемая потрохами windows

Ilia
23.01.2018
11:33:31
А держать shared_ptr в обработчике события нельзя?
Нельзя, объект выйдет из скопа обработчика и удалится.

А держать shared_ptr в обработчике события нельзя?
Ты что, никогда Windows-приложения не писал? :-)

Anatoly
23.01.2018
11:34:33
Ты что, никогда Windows-приложения не писал? :-)
Ну, Ильюха, много людей Windows даже в глаза не видели

Antony
23.01.2018
11:34:37
Ок, со стороны shared_ptr подлянки в виде бесконечной рекурсии не будет void shared_ptr::reset() noexcept; Effects: Equivalent to shared_ptr().swap(*this).

Ты что, никогда Windows-приложения не писал? :-)
Дык Qt же. Там это не так убого реашается, ибо можно shared_ptr держать в коллбеке, и если владелец колбека будет уничтожен, вузовется деструктор shared_ptr и ресурс не утечёт

Antony
23.01.2018
11:38:36
Нельзя, объект выйдет из скопа обработчика и удалится.
unordered_map<Handle, shared_ptr<MyClass> > open_windows_to_kill_without_holding_sp_in_this; Такая конструкция поможет избежать вызова delete this?

Ilia
23.01.2018
11:40:07
Был вопрос, про то, что такое delete this и валиден ли такой код. Было отвечено, что 0) код валиден 1) при этом надо соблюдать некоторые условия https://isocpp.org/wiki/faq/freestore-mgmt#delete-this 2) этот подход применяется во многих фреймворках. Собственно, и всё. Далее пошёл необоснованный хай, что это плохо, это некрасиво, и т.д.

Antony
23.01.2018
11:40:58
Хай обоснован тем, что в мире с исключениями ручное управление памятью и ресурсами есть зло

Matwey
23.01.2018
11:41:39
Господа, а можно ли как-то эту порнографию редуцировать, не используя препроцессор? struct width_visitor: public boost::static_visitor<std::size_t> { template<class T> std::size_t operator() (const image<T>& i) const { return i.width(); } }; struct height_visitor: public boost::static_visitor<std::size_t> { template<class T> std::size_t operator() (const image<T>& i) const { return i.height(); } }; struct depth_visitor: public boost::static_visitor<std::size_t> { template<class T> std::size_t operator() (const image<T>& i) const { return i.depth(); } };

Matwey
23.01.2018
11:44:11
http://en.cppreference.com/w/cpp/utility/variant/visit
У меня нет дженерик лямбд :(

Anatoly
23.01.2018
11:47:12
Хай обоснован тем, что в мире с исключениями ручное управление памятью и ресурсами есть зло
ну в контексте WINAPI я не имею право выпустить ниодного исключения, находясь в обработчике Windows события, к тому же delete this будет последнее, что мир запомнит об этом объекте

Google
Matwey
23.01.2018
11:49:20
Мало информации о роде порнографии, но Ванга спрашивает, может удастся использовать ссылки на методы?
Ну я не представляю существует ли такая синтаксическая конструкция как ссылка на метод неинстанцированного шаблона. &image<???>::width

Dmitry
23.01.2018
11:49:58
А в какой момент ты собираешься создавать объекты типа depth_visitor, например?

Matwey
23.01.2018
11:50:59
Всё, как завещали нам авторы бубсов: boost::apply_visitor(width_visitor{}, x);

Dmitry
23.01.2018
11:52:40
вот в этот момент нельзя взять адрес метода?

Matwey
23.01.2018
11:53:44
ммм... нет. ведь я не знаю какой именно тип хранится в варианте

Berkus
23.01.2018
13:06:25
@MasterZiv ^ вот твой кейс про окно

Admin
ERROR: S client not available

Antony
23.01.2018
13:09:21
https://github.com/boostorg/beast/blob/develop/example/advanced/server-flex/advanced_server_flex.cpp#L278
Это как раз нормально - там shared_ptr держится колбеком, а не в this. В случае шибки выполнится коллбек, завершится, а потом вызовется деструктор shared_ptr (уже не из метода класса)

Александр
23.01.2018
13:14:11
То, что Антон процитировал

Anatoly
23.01.2018
13:14:42
7 постов вверх
я не понял как это применимо к "оконной" проблеме, описанной выше

Александр
23.01.2018
13:15:22
я не понял как это применимо к "оконной" проблеме, описанной выше
Я сам не смотрел код beast, но походу там "объект сам управляет временем своей жизни" без delete this

Ilia
23.01.2018
13:17:11
я не понял как это применимо к "оконной" проблеме, описанной выше
Ну идея в том, что delete this можно заменить на агрегацию в данном классе shared_ptr на самого себя, и когда надо вызвать удаление уже через него...

Ну, можно и так.

Google
Anatoly
23.01.2018
13:17:40
Я сам не смотрел код beast, но походу там "объект сам управляет временем своей жизни" без delete this
Схематично код, создающий немодальное окно, выглядит так: auto wnd = std::make_unique<MyWindow>(); if( wnd->Create(... ) ) { wnd->Show (); wnd.reset(); }

Ilia
23.01.2018
13:18:08
Разницы практически ноль. Ну да, при создании объекта его память защищена по RAII...

Ilia
23.01.2018
13:18:46
Ну почему фиктивный только ?

Anatoly
23.01.2018
13:19:08
Ну почему фиктивный только ?
покажи полный пример, нифига не пойму о чем вы говорите

Ilia
23.01.2018
13:19:27
Вопрос-то был НЕ В ЭТОМ, а в том, что люди считают delete this невалидным с точки зрения С++, а это не так.

Anatoly
23.01.2018
13:19:36
откуда возьмется shared_ptr и кем он будет кипится?

Ilia
23.01.2018
13:19:38
ойнекогда

Alexander
23.01.2018
13:20:39
не надо перевирать. Люди считают delete this невалидным в случае, который я кидал выше

Andrei
23.01.2018
13:23:01
люди так не считают.
в @supapro парень именно так и думал, когда задавал вопрос. а это уже дальше разговор перешл из разряда "неправильно в с++" до "неправильно в дизайне"

Oleg
23.01.2018
13:23:04
delete this - это как goto. Лучше не использовать, но если знаешь что и зачем - то пожалуйста

Anatoly
23.01.2018
13:23:47
Схематично код, создающий немодальное окно, выглядит так: auto wnd = std::make_unique<MyWindow>(); if( wnd->Create(... ) ) { wnd->Show (); wnd.reset(); }

@berkus @antoshkka ребята, вот пример, при закрытии окна пользователем объект MyWindow должен уйти в мир иной.

Andrei
23.01.2018
13:24:55
Вопрос-то был НЕ В ЭТОМ, а в том, что люди считают delete this невалидным с точки зрения С++, а это не так.
а при delete this вызывается только деструктор или память осводобится тоже?

Egor
23.01.2018
13:25:29
а при delete this вызывается только деструктор или память осводобится тоже?
И память освободится. Деструктор явно вызывается как любой другой метод

Andrei
23.01.2018
13:32:03
И память освободится. Деструктор явно вызывается как любой другой метод
хм, тогда например в этом случае не будет утечки? X *x = new X; x->custom_delete(); а в custom_delete происходит delete this. x и this необязательно же должны совпадать

Egor
23.01.2018
13:32:36
хм, тогда например в этом случае не будет утечки? X *x = new X; x->custom_delete(); а в custom_delete происходит delete this. x и this необязательно же должны совпадать
Не будет. x и this в этом случае обязаны совпадать по определению this — это в точности указатель на объект, у которого вызван метод.

Страница 1682 из 2477