
Berkus
23.01.2018
10:08:42

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

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
Расскажите поподробнее про "сам контрлолирует свой время жизни"? Ну или пример кода скиньте

Michael
23.01.2018
10:44:42

Alexander
23.01.2018
10:45:48
???

Vsevolod
23.01.2018
10:46:04
вообще, это очень сложный вопрос
чтобы созданный объект сам хранил рефренс на себя

Google

Ilia
23.01.2018
10:46:52

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

Antony
23.01.2018
10:48:18

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

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

Ilia
23.01.2018
10:55:13

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.

Anatoly
23.01.2018
11:04:39

Google

Antony
23.01.2018
11:32:06


Anatoly
23.01.2018
11:33:10

Ilia
23.01.2018
11:33:31

Anatoly
23.01.2018
11:34:33

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

Ilia
23.01.2018
11:37:14
Блин, давайте к истокам.

Antony
23.01.2018
11:38:36

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
Хай обоснован тем, что в мире с исключениями ручное управление памятью и ресурсами есть зло

Ilia
23.01.2018
11:41:03

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();
}
};

Ilia
23.01.2018
11:41:53

Anatoly
23.01.2018
11:42:47

Matwey
23.01.2018
11:44:11

Anatoly
23.01.2018
11:47:12

Google

Dmitry
23.01.2018
11:48:07

Matwey
23.01.2018
11:49:20

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

Berkus
23.01.2018
13:07:55

Antony
23.01.2018
13:09:21

Berkus
23.01.2018
13:10:13

Александр
23.01.2018
13:10:21

Anatoly
23.01.2018
13:13:49

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

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

Александр
23.01.2018
13:15:22

Ilia
23.01.2018
13:17:11
Ну, можно и так.

Google

Anatoly
23.01.2018
13:17:40

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

Anatoly
23.01.2018
13:18:27

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. Лучше не использовать, но если знаешь что и зачем - то пожалуйста

Antony
23.01.2018
13:23:11

Alexander
23.01.2018
13:23:38

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

Egor
23.01.2018
13:25:29

Andrei
23.01.2018
13:32:03

Egor
23.01.2018
13:32:36