Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > delete this ? oO


Автор: boostcoder 17.12.2010, 07:44
всем привет.
задача немного нестандартная..
и так.. есть некоторый тип, который в конструкторе стартует асинхронную операцию. по завершении асинхронной операции, объект этого типа нужно удалить.

объект:
Код

struct reader: boost::noncopyable {
   reader() {
      // init
      async_operation();
   }
   ~reader() {
      // clean
   }
   // вызывается в момент завершения асинхронной операции
   void async_operation_finished() {
      delete this; // <<<<<
   }
};

так вот.. время жизни таких объектов не более 50мс.
в архитектуре приложения, использовать такие объекты на протяжении всего времени работы приложения, очень неудобно, из-за большого кол-ва таких объектов и связанных с этим блокировок синхронизаций.
полагаю, создавать эти объекты налету, по необходимости, будет сильно удобней.
в таком случае, время жизни таких объектов нельзя ограничивать блоком кода. поэтому придется создавать их в куче.

проблема: как удалять их? в смарт поинтеры пихать нельзя, иначе получим то же ограничение блоком.
вопрос: я подумал.. а что если, объекты по завершению асинхронной операции будут сами себя удалять? никогда такого не делал, потому не в курсе, насколько это допустимо.

спасибо.

Добавлено через 2 минуты
сами объекты еще не написал. потому не могу проверить. но ответ на этот вопрос нужен уже сейчас, чтоб потом не переписывать логику приложения.

Автор: azesmcar 17.12.2010, 07:50
Цитата(boostcoder @  17.12.2010,  07:44 Найти цитируемый пост)
никогда такого не делал, потому не в курсе, насколько это допустимо.

теоретически - допустимо, но связано со множеством проблем. Во первых если объект не был создан по средствам оператора new, будет нехорошо. Во вторых нужно быть уверенным, что никто после этого не попытается обратиться к объекту.

Цитата(boostcoder @  17.12.2010,  07:44 Найти цитируемый пост)
и так.. есть некоторый тип, который в конструкторе стартует асинхронную операцию. по завершении асинхронной операции, объект этого типа нужно удалить.

А зачем для этого нужен класс?
Почему бы этим не заняться какому-то отдельному классу типа thread pool или std::async.
Код

std::async(oper1);
std::async(oper2);
...

и ничего удалять не надо.

Автор: boostcoder 17.12.2010, 07:56
Цитата(azesmcar @  17.12.2010,  07:50 Найти цитируемый пост)
Во первых если объект не был создан по средствам оператора new, будет нехорошо.

это невозможно.... а можно каким-либо образом сделать проверку на стеке или в куче был создан объект?

Цитата(azesmcar @  17.12.2010,  07:50 Найти цитируемый пост)
Во вторых нужно быть уверенным, что никто после этого не попытается обратиться к объекту.

к нему никто не обращается. только сам объект вызывает полученный в конструктор функциональный объект.

Цитата(azesmcar @  17.12.2010,  07:50 Найти цитируемый пост)
А зачем для этого нужен класс?

у объекта есть собственные данные..

std::async() поддерживает move semantic?

Добавлено через 4 минуты и 46 секунд
т.е. по идее, это:
Код

std::async(reader(...));

должно решить проблему..

Автор: azesmcar 17.12.2010, 08:01
Цитата(boostcoder @  17.12.2010,  07:56 Найти цитируемый пост)
это невозможно

каким образом обеспечивается невозможность?

Цитата(boostcoder @  17.12.2010,  07:56 Найти цитируемый пост)
 а можно каким-либо образом сделать проверку на стеке или в куче был создан объект?

 smile 

Цитата(boostcoder @  17.12.2010,  07:56 Найти цитируемый пост)
у объекта есть собственные данные..

функтор+std::async

Цитата(boostcoder @  17.12.2010,  07:56 Найти цитируемый пост)
std::async() поддерживает move semantic? 

В каком смысле? move чего?
Код

struct async_operation
{
    void operator()()
    {
        /* TODO */
    }
    int x;
    int y;
};

int main()
{
    std::async(async_operation());
}


Автор: boostcoder 17.12.2010, 08:27
Цитата(azesmcar @  17.12.2010,  08:01 Найти цитируемый пост)
каким образом обеспечивается невозможность?

мной smile 

Цитата(azesmcar @  17.12.2010,  08:01 Найти цитируемый пост)
функтор+std::async

угу

Автор: azesmcar 17.12.2010, 08:53
Если состояние потока вообще не интересует, то можно так
Код

std::thread(async_operation()).detach();


Автор: boostcoder 17.12.2010, 08:54
Цитата(azesmcar @  17.12.2010,  08:53 Найти цитируемый пост)
Если состояние потока вообще не интересует, то можно так

 smile 
протупил.
вопрос закрыт.

Автор: mes 17.12.2010, 09:40
Цитата(boostcoder @  17.12.2010,  06:56 Найти цитируемый пост)
а можно каким-либо образом сделать проверку на стеке или в куче был создан объект?

можно спрятать конструктор (и добавить креаторную функцию ) или деструктор (для делете this)..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)