Pracuję nad aplikacją intensywnie wykorzystującą pamięć, która powinna odpowiednio obsługiwać sytuacje braku pamięci.Gdzie przechowuje się przechwycone zmienne zamknięcia?
Mam coś jak
class memory_manager {
// returns true if slot created (and function is being run)
// false otherwise
static bool create_slot(int id, std::function<void (slot&)>); ........
}
obsługuje tej klasy, dzienniki, i tak na wszystkich out-of-memory kwestii, zachowuje własność wszystkich gniazdach i dysków współbieżności.
Mam jednak nieobsługiwany std::bad_alloc
na następujący kod:
slot_data_to_copy dat;
memory_manager::create_slot(100, [&dat](slot& sx) { sx.assign_data(dat); });
Zakładam, że rzut odbywa się podczas przechwytywania zmienne. (Przechwytywam ich więcej, to tylko przykładowy przykład)
Gdzie jest utworzone zamknięcie? Czy mogę to kontrolować? Lub, jeśli zaktualizuję menedżera w taki sposób, że przyjmuje on parametr, taki jak
slot_data_to_copy dat;
memory_manager::create_slot<slot_data_to_copy>
(100, dat, [](slot& sx, slot_data_to_copy& dat)
{ sx.assign_data(dat); }
);
czy ma pewność, że w ogóle go nie rzuci?
Kompiluję oba przy użyciu Visual C++ na Windows i GCC na Linuksie, ale obserwowałem to zachowanie tylko w systemie Windows (na Linuksie, zabrakło pamięci prawdopodobnie gdzieś, gdzie mogę sobie z tym poradzić).
EDIT:
http://en.cppreference.com/w/cpp/utility/functional/function/function - std :: funkcja zawiera nothrow operatorów .. ja chyba czegoś brakuje, ale który z nich jest używany w tej sytuacji (lambda)?
'Zakładam, że rzut jest wykonywany podczas przechwytywania zmiennych. '- lambda jest kopiowana na stercie? i, kiedy zostanie wydany? – nothrow
[expr.prim.lambda]/2 "Ocena wyrażenia lambda skutkuje tymczasową prwartością, która jest nazywana * obiektem zamknięcia *." Ctor 'std :: function', który jest tu używany, to' template < class F > function (F f); ', który jest * nie *' noexcept'. – dyp