Порядок уничтожения сопрограмм C++C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Порядок уничтожения сопрограмм C++

Сообщение Anonymous »

В этой статье представлен псевдокод того, как компилятор преобразует функцию сопрограммы:

Код: Выделить всё

ReturnType someCoroutine(Parameters parameter)
{
auto* frame = new coroutineFrame(std::forward
(parameters));
auto returnObject = frame->promise.get_return_object();
co_await frame->promise.initial_suspend();
try
{

}
catch (...)
{
frame->promise.unhandled_exception();
}
co_await frame->promise.final_suspend();
delete frame;
return returnObject;
}
Однако этот псевдокод будет означать, что если ваш тип сопрограммы возвращает продолжение из Final_suspend, то память только что завершившейся сопрограммы не будет освобождена до после em> продолжение работает, что кажется далеко не идеальным. Когда я пытаюсь запустить этот минимальный пример, кажется, что это происходит раньше:

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 

template
class Future;

template
class Future
{
public:
class Awaiter;

class promise_type {
private:
std::exception_ptr _exception;
std::coroutine_handle _continuation;

friend class Awaiter;

public:
Future get_return_object() { return {HandleT::from_promise(*this)}; }

static Future get_return_object_on_allocation_failure() {
abort();
}

// Futures are lazy, they don't do anything until they are
// awaited or a task is spawned that takes one.
std::suspend_always initial_suspend() { return {}; }

// Always cleanup right away. Maybe not the right choice?
std::suspend_never final_suspend() noexcept {
std::cerr 

Подробнее здесь: [url]https://stackoverflow.com/questions/79327138/c-coroutine-destruction-order[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»